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

python virtual environments visualization

نویسندگان ‌: محیا مهدیان و محمد حسن ستاریان

مقدمه

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

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

  • conda
  • virtualenv
  • virtualenvwrapper
  • pyvenv

کوندا (Conda)


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

از مزایای conda می‌شود به موارد زیر اشاره کرد:

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

نصب

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

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

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

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

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

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

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

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

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

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

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

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

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

virtualenv


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

نصب

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

 

چنانچه بر روی سیستم عاملی هر دو نسخه پایتون 2x یا 3x نصب است؛ این موضوع که virtualenv را توسط pip کدام نسخه نصب نمایید، اهمیت چندانی ندارد. چرا که امکان استفاده از آن برای دیگر نسخه‌ها نیز وجود دارد.

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

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

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

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

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

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

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

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

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

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

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

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

 

virtualenvwrapper


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

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

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

نصب

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

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

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

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

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

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

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

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

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

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

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

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

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

pyvenv


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

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

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

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

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

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

 

منابع

کوندا (Conda)

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

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

virtualenv

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

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

virtualenvwrapper

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

مستندات virtualenvwrapper

pyvenv

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

 

مطالعه بیشتر

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

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