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

مقدمهمحیط‌های مجازی (virtual environments) از مهمترین شیوه‌های آزموده شده (Best practice) در توسعه نرم‌افزار تحت پایتون هستند. از آنجایی که با نصب پکیج‌های پایتون، همگی این پکیج‌ها در یک مسیر‌ مشخصی نصب می‌شوند، ممکن است باعث ایجاد مشکلاتی شوند. برای مثال حالتی را در نظر بگیرید که در ایجاد پروژه‌های مختلف به نسخه‌های متفاوتی از برخی کتابخانه‌ها نیاز دارید؛ در این صورت چگونه می‌توانید چندین نسخه‌ متفاوت از یک کتابخانه‌ را در پروژه‌های مختلف پایتون استفاده کنید؟ فرض کنید می‌خواهیم بر روی توسعه دو وب‌سایت؛ یکی توسط نسخه (۱.۸) وب فریم‌ورک جنگو (Django) و دیگری بر روی یک نسخه قدیمی (۰.۹۶) از آن کار کنیم، ولی نمی‌توانیم! چراکه نمی‌شود هر دوی این نسخه‌ها را با هم در پایتون (دایرکتوری site-packages) نصب داشت. یا فرض کنید که برای تست پکیج‌هایی، می‌خواهیم بدون نصب آن‌ها در کنار پروژه اصلی، از آن‌ها استفاده کنیم؛ در این وضعیت راه حل ایجاد محیط‌هایی مجازی (Virtual Environments) برای توسعه پروژه‌های مورد نظر است، ابزاری که محیط توسعه و اجرای هر پروژه پایتون را به همراه تمام وابستگی‌های (Dependencies) آن از پروژه‌های دیگر جدا یا ایزوله (AKA. Sandboxing) می‌کند.این ویژگی ایزوله کردن که محیط‌های مجازی فراهم می‌کنند، در توسعه میکروسرویس‌ها و کانتینرها بسیار مورد استفاده قرار می‌گیرد و استفاده از محیط‌های مجازی را امری بدیهی می‌کند.پکیج‌های پایتون بسته به اینکه پکیج‌های پیش‌فرض زبان (system packages) هستند یا پکیج‌های شخص‌ثالثی هستند که شما توسط PIP یا easy_install نصب کرده‌اید (site packages)، در مکان‌های زیر نصب می‌شوند:&quot&quot&quot Python REPL &quot&quot&quot # 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' ] در ادامه به بررسی ابزارهای زیر می‌پردازیم:condavirtualenvvirtualenvwrapperpyvenvکوندا (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مقاله «رمزبرداری از محیط‌های مجازی»این پست پیش از این در تیر ۹۷ در وبلاگ بینایی ماشین منتشر شده بود.