محیط مجازی (Virtual Environment) در پایتون چیست؟

محیط مجازی (Virtual Environment) ابزاری است که به جدا نگه داشتن وابستگی‌‎های (dependency) مورد نیاز پروژه‌های مختلف با ایجاد محیط‌های مجازی پایتون ایزوله برای آنها، کمک می‌کند. یکی از مهمترین ابزارهایی است که اکثر توسعه دهندگان پایتون از آن استفاده می‌کنند.


چرا به محیط مجازی (Virtual Environment) نیاز داریم؟

سناریویی را تصور کنید که در آن روی دو پروژه پایتون مبتنی بر وب کار می‌کنید که یکی از آنها از جنگو 4.0 و دیگری از جنگو 4.1 استفاده می‌کند. در چنین شرایطی محیط مجازی می‌تواند برای حفظ وابستگی‌های هر دو پروژه واقعا مفید باشد.

دلایل متعددی وجود دارد که چرا محیط‌های مجازی ایده خوبی هستند:

  • جلوگیری از تداخل (Conflict) نسخه

می‌توان استدلال کرد که نصب بسته‌های شخص ثالث در سراسر سیستم بسیار کارآمد است. کافیست آن را یک بار نصب کنید تا از آن بسته در پروژه‌های متعدد پایتون استفاده نموده و در زمان و فضای دیسک صرفه جویی کنید. مشکلی در این رویکرد وجود دارد که ممکن است هفته‌ها یا ماه‌ها بعد آشکار شود.

فرض کنید پروژه الف، برای نسخه خاصی از کتابخانه X نوشته شده است؛ در آینده ممکن است نیاز به ارتقاء کتابخانه X داشته باشید. مثلا برای پروژه دیگری که شروع کرده‌اید، به نام پروژه ب، کتابخانه X را به آخرین نسخه ارتقا دهید و پروژه ب به خوبی کار می‌کند. ولی پس از انجام این کار، کد پروژه الف به شدت خراب می‌شود. استفاده از یک محیط مجازی این مشکل را با جداسازی پروژه‌ای از سایر پروژه‌ها و بسته‌های سراسری سیستم برطرف می‌کند. فقط بسته‌هایی را در داخل این محیط مجازی مخصوص پروژه‌ای که روی آن کار می‌کنید نصب می‌شود.

  • تکثیر و نصب آسان

محیط‌های مجازی تعریف و نصب بسته‌های خاص پروژه را آسان می‌کند. با استفاده از یک فایل requires.txt، می‌توانید شماره‌های دقیق نسخه را برای بسته‌های مورد نیاز تعریف کنید تا مطمئن شوید که پروژه شما همیشه با نسخه‌ای که با کد شما آزمایش شده کار می‌کند. همچنین به سایر کاربران نرم افزار  کمک می‌کند چون یک محیط مجازی به دیگران کمک می کند تا دقیقا محیطی را که نرم افزار شما برای آن ساخته شده است، تولید کنند.

  • همه جا کار می‌کند، حتی زمانی root نباشد.

اگر روی یک هاست اشتراکی کار می‌کنید، نمی‌توانید بسته‌های سراسری سیستم(system-wide) را نصب کنید زیرا دسترسی لازم  برای این کار را ندارید. در این موارد، یک محیط مجازی به شما این امکان را می‌دهد که هر چیزی را که می‌خواهید به صورت لوکال در پروژه خود نصب کنید.

مقایسه محیط‌های مجازی و راهکارهای دیگر

گزینه های دیگری برای جداسازی پروژه شما وجود دارد:

  1. در بدترین حالت، می‌توانید یک کامپیوتر دیگر تهیه کرده و کد خود را در آنجا اجرا نمائید. مشکل رفع می‌شود ولی افزایش هزینه خواهید داشت.
  2. ماشین مجازی گزینه بسیار ارزان‌تری است، اما نیاز به نصب یک سیستم عامل کامل دارد و بخش از منابع هدر می‌رود.
  3. راهکار بعدی، کانتینرسازی است، مانند Docker و Kubernetes که می‌توانند بسیار قدرتمند باشند و جایگزین خوبی هستند.

با این حال، در بسیاری موارد ما فقط پروژه‌های کوچک یا اسکریپت‌های one-off ایجاد می‌شود  یا شاید اصلا نمی‌خواهید برنامه خود را کانتینری کنید. بپس به هر حال باید Virtual Environment را یاد گرفته و درک نمائید. دلیلش هر چه باشد، محیط‌های مجازی راهی عالی برای جداسازی وابستگی‌های پروژه شما هستند.

محیط مجازی در پایتون

چه زمانی و کجا از محیط مجازی (Virtual Environment) استفاده کنیم؟

به طور پیش فرض، هر پروژه در سیستم شما از همین دایرکتوری‌ها برای ذخیره و بازیابی بسته‌های سایت (کتابخانه‌های شخص ثالث) استفاده می‌کند. این چه اهمیتی دارد؟ حال در مثال بالا دو پروژه، از دو نسخه جنگو دارید. این یک مشکل واقعی برای پایتون است زیرا نمی‌تواند بین نسخه‌های موجود در دایرکتوری site-packages تفاوت قائل شود. بنابراین هر دو v1.9 و v1.10 در یک دایرکتوری با همان نام قرار دارند. اینجاست که محیط‌های مجازی وارد عمل می‌شوند. برای حل این مشکل فقط باید دو محیط مجازی مجزا برای هر دو پروژه ایجاد کنیم. نکته مهم این است که هیچ محدودیتی برای تعداد محیط‌هایی که می‌توانید داشته باشید وجود ندارد زیرا آنها فقط دایرکتوری‌هایی هستند که حاوی چند اسکریپت می‌باشند. به طور کلی خوب است که برای هر پروژه مبتنی بر پایتون که روی آن کار می‌کنید، یک محیط مجازی جدید داشته باشید. بنابراین وابستگی‌های هر پروژه از سیستم و بقیه پروژه‌ها جدا می‌شوند.

سرور مجازی یک ماشین مجازی کامل است که امکان دسترسی SSH طبق آموزش را به آن خواهید داشت.
خرید سرور مجازی در پنج موقعیت جغرافیایی ایران، ترکیه، هلند، آلمان و آمریکا با قابلیت تحویل آنی در پارسدو فراهم است.

 

محیط مجازی (Virtual Environment) چگونه کار می‌کند؟

ما از یک ماژول به نام virtualenv استفاده می‌کنیم که ابزاری برای ایجاد محیط‌های ایزوله پایتون است. virtualenv پوشه‌ای ایجاد می‌کند که شامل تمام فایل‌های اجرایی لازم برای استفاده از بسته‌هایی است که یک پروژه پایتون به آن نیاز دارد.

در حال نصب virtualenv

pip install virtualenv

با استفاده از virtualenv

virtualenv --version

با استفاده از دستور زیر می توانید یک virtualenv ایجاد کنید:

virtualenv my_name
 

پس از اجرای این دستور، دایرکتوری با نام my_name ایجاد می‌شود. این دایرکتوری حاوی تمام فایل‌های اجرایی لازم برای استفاده از بسته‌هایی است که یک پروژه پایتون به آن نیاز دارد. این جایی است که بسته‌های پایتون نصب می‌شود. اگر می‌خواهید مفسر پایتون مورد نظر خود را مشخص کنید، به عنوان مثال پایتون 3، می‌توانید با استفاده از دستور زیر این کار را انجام دهید:

 

virtualenv -p /usr/bin/python3 virtualenv_name

برای ایجاد یک محیط مجازی پایتون 2.7 از دستور زیر استفاده کنید:

 

virtualenv -p /usr/bin/python2.7 virtualenv_name

حال پس از ایجاد محیط مجازی، باید آن را فعال کنید. به یاد داشته باشید که هر بار که روی پروژه کار می‌کنید، محیط مجازی مربوطه را فعال کنید. این کار را می‌توان با استفاده از دستور زیر انجام داد:


نکته: source یک دستور shell است که برای کاربرانی که روی لینوکس (یا هر Posix، هر چیزی، به جز ویندوز) اجرا می‌کنند طراحی شده است.

برای فعال کردن محیط مجازی با استفاده از command prompt  ویندوز
دایرکتوری را به virtual env خود تغییر دهید

$ cd [envname]
$ Scripts\activate 

$ source virtualenv_name/bin/activate
 

پس از فعال شدن محیط مجازی، نام محیط مجازی شما در سمت چپ ترمینال ظاهر می‌شود. این به شما اطلاع می‌دهد که محیط مجازی در حال حاضر فعال است. در تصویر زیر venv با نام محیط مجازی فعال است. اکنون می‌توانید وابستگی‌های مربوط به پروژه را در این محیط مجازی نصب کنید. به عنوان مثال، اگر از Django 1.9 برای پروژه‌ای استفاده می‌کنید، می‌توانید آن را مانند سایر بسته‌ها نصب نمائید.

[virtualenv_name] pip install Django==1.9

بسته جنگو 1.9 در پوشه virtualenv_name قرار گرفته و از سیستم کامل جدا می‌شود. پس از اتمام کار، می‌توانید محیط مجازی را با دستور زیر غیرفعال کنید:

[virtualenv_name] deactivate

اکنون به نصب پیشفرض پایتون سیستم باز می‌گردید.