
نویسندگان : محیا مهدیان و محمد حسن ستاریان
مقدمه
محیطهای مجازی (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 توسط دستورات بالا به صورت زیر تبدیل میشود:
اکنون میتوانیم در پروژه خود به کتابخانهها، 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 و ورود به آن از دستور زیر استفاده میکنیم:
ورود و خروج به محیط مجازی
برای ورود و فعال سازی محیط مجازی ای با نام myenv به صورت زیر عمل میکنیم:
و برای خروج و غیر فعال کردن محیط از دستور زیر استفاده میکنیم:
برای لیست کردن محیطهای مجازی از دستور
lsvirtualenv و یا دستور
workon بدون ورودی استفاده میکنیم.
حذف محیط مجازی
برای حذف محیط مجازی ای که دیگر به آن احتیاج نداریم به صورت زیر عمل میکنیم:
یک دستور جالب این پکیج
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
مقاله «رمزبرداری از محیطهای مجازی»
شبکه های اجتماعی