محیط‌های مجازی پایتون (Python virtual environments)

مقدمه

محیط‌های مجازی (virtual environments) از مهمترین شیوه‌های آزموده شده (Best practice) در توسعه نرم‌افزار تحت پایتون هستند. از آنجایی که با نصب پکیج‌های پایتون، همگی این پکیج‌ها در یک مسیر‌ مشخصی نصب می‌شوند، ممکن است باعث ایجاد مشکلاتی شوند. برای مثال حالتی را در نظر بگیرید که در ایجاد پروژه‌های مختلف به نسخه‌های متفاوتی از برخی کتابخانه‌ها نیاز دارید؛ در این صورت چگونه می‌توانید چندین نسخه‌ متفاوت از یک کتابخانه‌ را در پروژه‌های مختلف پایتون استفاده کنید؟ فرض کنید می‌خواهیم بر روی توسعه دو وب‌سایت؛ یکی توسط نسخه (۱.۸) وب فریم‌ورک جنگو (Django) و دیگری بر روی یک نسخه قدیمی (۰.۹۶) از آن کار کنیم، ولی نمی‌توانیم! چراکه نمی‌شود هر دوی این نسخه‌ها را با هم در پایتون (دایرکتوری site-packages) نصب داشت. یا فرض کنید که برای تست پکیج‌هایی، می‌خواهیم بدون نصب آن‌ها در کنار پروژه اصلی، از آن‌ها استفاده کنیم؛ در این وضعیت راه حل ایجاد محیط‌هایی مجازی (Virtual Environments) برای توسعه پروژه‌های مورد نظر است، ابزاری که محیط توسعه و اجرای هر پروژه پایتون را به همراه تمام وابستگی‌های (Dependencies) آن از پروژه‌های دیگر جدا یا ایزوله (AKA. Sandboxing) می‌کند.

این ویژگی ایزوله کردن که محیط‌های مجازی فراهم می‌کنند، در توسعه میکروسرویس‌ها و کانتینرها بسیار مورد استفاده قرار می‌گیرد و استفاده از محیط‌های مجازی را امری بدیهی می‌کند.

پکیج‌های پایتون بسته به اینکه پکیج‌های پیش‌فرض زبان (system packages) هستند یا پکیج‌های شخص‌ثالثی هستند که شما توسط PIP یا easy_install نصب کرده‌اید (site packages)، در مکان‌های زیر نصب می‌شوند:

""" Python REPL """

# system packages
>>> import sys
>>> sys.prefix
'/System/Library/Frameworks/Python.framework/Versions/3.5'


# site packages
>>> import site
>>> site.getsitepackages()
[
  '/System/Library/Frameworks/Python.framework/Versions/3.5/Extras/lib/python',
  '/Library/Python/3.5/site-packages'
]

در ادامه به بررسی ابزارهای زیر می‌پردازیم:

  • conda
  • virtualenv
  • virtualenvwrapper
  • pyvenv



کوندا (Conda)

یکی از روش‌های مدیریت ورژن‌های پایتون و همچنین ایجاد محیط‌های مجازی پایتون استفاده از ابزاری به نام کوندا (conda) است؛ این ابزار که همراه پکیج Anaconda و یا miniconda عرضه می‌شود، ویژگی‌های زیر را دارد:

  • ساختار مشخص و ساده : شناخت ساختار فولدربندی آن بسیار ساده است.
  • مدیریت پنهان فایل‌ها : فایل‌های مربوطه را خارج از فولدر خود نصب نمی‌کند.
  • انعطاف‌پذیری : علاوه‌بر پکیج‌های زیادی که خود پشتیبانی می‌کند، پکیج‌های pip نیز در محیط‌های ساخته شده توسط کوندا قابل نصب هستند.
  • چندمنظوره: علاوه بر مدیریت محیط‌های مجازی و نسخه‌های پایتون برای زبان‌های دیگر مانند R هم استفاده می‌شود.
تفاوت پکیج‌های Anaconda و minicoda در این است که Anaconda را می‌توان یک پکیج کامل از ابزارهای داده‌کاوی و یادگیری ماشین دانست که همراه خود علاوه‌بر ابزار کوندا، ابزارهای دیگری مانند spyder، jupyter و تعداد زیادی از پکیج‌های پایتون مورد نیاز این زمینه را نصب می‌کند؛ درحالی‌که miniconda صرفا ابزار کوندا برای مدیریت ورژن‌ها و مفسر‌های پایتون و تعداد کمی از کتابخانه‌ها را در اختیار می‌گذارد.

نصب

برای نصب Conda از این آموزش استفاده کنید.

ساخت محیط مجازی توسط Conda

برای ساخت محیط مجازی ای با نام myenv و نصب پایتون ۳.۴ و پکیج‌های package1 و package2 با ورژن دلخواه به صورت زیر عمل می‌کنیم:

conda create -n myenv [python=3.4 package1 package2=version]

ورود و خروج به محیط مجازی

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

# Windows
activate myenv

# Linux
source activate myenv

در صورتی که به درستی وارد محیط مجازی شوید، prompt خط فرمان تغییر می‌کند. برای مثال با فعال کردن محیط myenv توسط دستورات بالا به صورت زیر تبدیل می‌شود:

(myenv) C:\>

اکنون می‌توانیم در پروژه خود به کتابخانه‌ها، pip، دایرکتوری site-packages و مفسری اختصاصی دسترسی داشته باشیم.

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

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

# Windows
deactivate

# Linux
source deactivate

برای لیست کردن محیط‌های مجازی ساخته شده از دستور conda env list و برای لیست کردن پکیج‌ها درون یک محیط از دستورات conda list و یا pip list با توجه به اینکه با کدام روش پکیج‌ها را نصب کرده‌ایم استفاده می‌کنیم.

حذف محیط مجازی

برای حذف محیط مجازی ای که دیگر به آن احتیاج نداریم به صورت زیر عمل می‌کنیم:

conda remove -n yourenvname -all

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

از آنجایی که Conda پکیجی چندمنظوره بوده و امکانات و نرم‌افزار‌های زیادی را همراه خود دارد، حجیم بوده و راه‌اندازی آن ممکن است به زمان بیشتری نیاز داشته باشد. روش دیگر ساخت محیط‌های مجازی استفاده از پکیج virtualenv و یا افزونه آن virtualenvwrapper است که در ادامه توضیح داده خواهند شد.



‏virtualenv

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

نصب

این پکیج به راحتی با استفاده از پیپ (pip) به صورت زیر قابل نصب است:

# Windows
pip install virtualenv

# Linux (installs system-wide)
sudo -H pip install virtualenv
چنانچه بر روی سیستم عاملی هر دو نسخه پایتون 2x یا 3x نصب است؛ این موضوع که virtualenv را توسط pip کدام نسخه نصب نمایید، اهمیت چندانی ندارد. چرا که امکان استفاده از آن برای دیگر نسخه‌ها نیز وجود دارد.

ساخت محیط مجازی توسط virtualenv

اکنون برای ایجاد یک محیط مجازی از دستور virtualenv ENV استفاده می‌شود که منظور از ENV در آن، نشانی دایرکتوری دلخواهی است که قصد داریم محیط مجازی در آن ایجاد گردد:

virtualenv Documents/ENV/

دستور بالا موجب ایجاد یک محیط مجازی در مسیر /Documents/ENV سیستم عامل، بر پایه مفسر پایتونی که از pip آن برای نصب virtualenv استفاده کردیم می‌شود و چنانچه بخواهیم محیط مجازی خود را بر پایه‌ نسخه‌ موجود دیگری از پایتون ایجاد نماییم، لازم است با استفاده از فلگ python-- نشانی مفسر آن مشخص گردد [صفحه راهنما + این پاسخ ]:

# Versions Already installed
virtualenv --python=python2 ENV
virtualenv --python=python3 ENV

## Versions user downloaded
# Windows
virtualenv --python=C:\Python25\python.exe Documents\ENV\
# Linux
virtualenv --python=/opt/python3.3/bin/python ENV

در نمونه کد‌ بالا، نسخه‌های۲.۷ و ۳.۴ پایتون از پیش بر روی سیستم عامل نصب بوده و نسخه ۳.۳ و ۲.۵ توسط کاربر در مسیرهای مشخص شده نصب شده است.

ورود و خروج به محیط مجازی

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

# Windows
> cd Documents\SampleENV\
> Scripts\activate.bat

(SampleENV)>

# Linux
$ cd Documents/SampleENV/
$ source bin/activate

(SampleENV)$

توجه کنید که با ورود موفق به محیط مجازی، prompt خط فرمان چگونه تغییر می‌کند.

اکنون می‌توانیم در پروژه خود به کتابخانه‌ها، pip، دایرکتوری site-packages و مفسری اختصاصی دسترسی داشته باشیم. همچنین با فعال کردن یک محیط مجازی، فایل‌های اجرایی مربوط به این محیط درون متغیر PATH قرار می‌گیرند تا همانند تا دستورات مورد استفاده به سادگی در دسترس باشند.

در لینوکس می‌توانید با اجرای دستورات which python3 و which pip3 بررسی کنید که مسیر فایل اجرایی مفسر پایتون و pip از مسیر معمول آن (usr/bin/python3/)‌ متفاوت است.

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

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

# Windows
(SampleENV)> deactivate.bat

# Linux
(SampleENV)$ deactivate

اگر از لینوکس استفاده می‌کنید، با اضافه کردن alias های زیر می‌توان کار ورود و خروج از محیط‌های مجازی را ساده‌تر کرد:

alias ae='deactivate &>/dev/null; source ./venv/bin/activate'
alias de='deactivate &>/dev/null'




‏virtualenvwrapper

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

  • جلوگیری از ساخت دایرکتوری مربوط به مدیریت پایتون و محیط مجازی کنار فایل‌های پروژه (در صورت استفاده از git، باید این فولدر را در gitignore. اضافه کنید)
  • لزوم به اعمال فعال سازی و غیر فعال سازی
  • و موارد دیگر

این پکیج برای لینوکس توسعه داده شده است و برای ویندوز یک توزیع از این پکیج با نام virtualenvwrapper-win قابل استفاده است.

نصب

این پکیج به راحتی با استفاده از پیپ (pip) به صورت زیر قابل نصب است:

# Windows
pip install virtualenvwrapper-win

# Linux (installs system-wide)
sudo -H pip install virtualenvwrapper

پکیج virtualenvwrapper برخلاف virtualenv و مانند conda، تمام محیط‌های مجازی را داخل یک دایرکتوری که ما مشخص می‌کنیم ذخیره می‌کند که اینکار باعث جداسازی کد‌ها و پکیج‌های پایتونی ای که نصب می‌کنیم بدون ایجاد ایراداتی که اشاره شد می‌شود.

پیش از ساخت محیط‌های مجازی، اگر از لینوکس استفاده می‌کنید دو دستور پایین را داخل فایل bashrc. (یا zshrc. یا کانفیگ فایل هر شل مورد استفاده) قرار می‌دهیم:

# virtualenvwrapper configuration
export WORKON_HOME=$HOME/.virtualenvs # Save all virtual environment in this path
source /usr/local/bin/virtualenvwrapper.sh # Activate it please

و اگر از ویندوز استفاده می‌کنید متغیری با نام WORKON_HOME در Environment Variable ویندوز اضافه کرده و مقدار آن را برابر USERPROFILE%\Envs% می‌گذاریم. [آموزش]
با اینکار فولدر virtualenvs. را در لینوکس و فولدر Envs را در ویندوز و در مسیر‌های مشخص شده برای ذخیره سازی محیط‌های مجازی مشخص می‌کنیم.

ساخت محیط مجازی توسط virtualenvwrapper

برای ساخت محیط مجازی ای با نام myenv و ورود به آن از دستور زیر استفاده می‌کنیم:

mkvirtualenv myenv

ورود و خروج به محیط مجازی

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

workon my_first_venv

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

deactivate

برای لیست کردن محیط‌های مجازی از دستور lsvirtualenv و یا دستور workon بدون ورودی استفاده می‌کنیم.

حذف محیط مجازی

برای حذف محیط مجازی ای که دیگر به آن احتیاج نداریم به صورت زیر عمل می‌کنیم:

rmvirtualenv myenv
یک دستور جالب این پکیج mktmpenv است که یک محیط مجازی با اسم تصادفی ساخته و آن‌را فعال می‌کند و با غیر فعال کردن آن محیط مجازی را پاک می‌کند که برای تست یک کد یا پکیج به سرعت ایده‌آل است.




‏pyvenv

در نسخه‌های از ۳.۳ به بعد پایتون، ماژولی با نام venv برای ایجاد محیط‌های مجازی به کتابخانه استاندارد پایتون افزوده شده است که می‌توان از آن به جای نصب virtualenv استفاده نمود و نیازی به نصب ندارد؛ برای این منظور از دستور pyvenv و با الگویی مشابه pyvenv ENV استفاده می‌گردد. تنها عیب این روش این است که نمی‌توان در آن ورژن پایتون را برای محیط‌های مختلف تغییر داد و همگی ورژن پایتون نصب شده روی سیستم را خواهند داشت.

ساخت محیط مجازی توسط pyvenv

برای ساخت محیط مجازی ای با نام myenv و ورود به آن از دستور زیر استفاده می‌کنیم:

# Windows
python C:\Python34\Tools\Scripts\pyvenv.py Documents\myenv\
# Or
python -m venv Documents\myenv\

#Linux
pyvenv Documents/myenv/

ورود و خروج به محیط مجازی

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

# Windows
cd Documents\myenv\
Scripts\activate.bat

# Prompt will change like this
(myenv)>

# Linux
cd Documents/myenv/
source bin/activate

# Prompt will change like this
(myenv)$

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

# Windows
(myenv)> deactivate.bat

# Linux
(myenv)$ deactivate




منابع

کوندا (Conda)

مقاله «چرا به محیط‌های پایتون نیاز دارید و چگونه آن‌ها را با کوندا مدیریت کنیم» در مدیوم

مقاله «ساخت محیط‌های مجازی برای پایتون توسط کوندا» از سری مقاله‌های دستورالعمل‌های ۲ دقیقه‌ای برای دانشمندان

‏virtualenv

فصل «ایجاد محیط مجازی» از کتاب آنلاین پایتون کدرز

مقاله «پایتونیک - معرفی Virtual Environment‌ها قسمت اول» در ویرگول

‏virtualenvwrapper

مقاله «پایتونیک - معرفی Virtual Environment‌ها قسمت دوم» در ویرگول

مستندات virtualenvwrapper

‏pyvenv

فصل «ایجاد محیط مجازی» از کتاب آنلاین پایتون کدرز

مطالعه بیشتر

این سوال و جواب در stackoverflow

مقاله «رمزبرداری از محیط‌های مجازی»


این پست پیش از این در تیر ۹۷ در وبلاگ بینایی ماشین منتشر شده بود.