12. محیطهای مجازی و بستهها¶
12.1. مقدمه¶
برنامههای پایتون معمولاً از بستهها و ماژولهایی استفاده میکنند که بخشی از کتابخانهی استاندارد نیستند. همچنین، گاهی یک برنامه به نسخهی مشخصی از یک کتابخانه نیاز دارد؛ زیرا ممکن است به رفع یک باگ خاص وابسته باشد یا با استفاده از نسخهی قدیمیتری از رابط آن کتابخانه نوشته شده باشد.
این موضوع باعث میشود که یک نصب واحد از پایتون نتواند نیازهای همهی برنامهها را برآورده کند. برای مثال، اگر برنامهی A به نسخهی 1.0 یک ماژول نیاز داشته باشد، اما برنامهی B به نسخهی 2.0 همان ماژول وابسته باشد، این نیازها با یکدیگر در تعارض خواهند بود و نصب هر یک از نسخههای 1.0 یا 2.0 باعث میشود یکی از برنامهها دیگر قابل اجرا نباشد.
راهحل این مشکل، ایجاد یک محیط مجازی است؛ یک ساختار پوشه مستقل که شامل یک نصب از پایتون برای نسخهای مشخص از پایتون، بههمراه تعدادی بستهی اضافی است.
به این ترتیب، هر برنامه میتواند از محیط مجازی مخصوص به خود استفاده کند. برای حل مثال قبلی، برنامهی A میتواند محیط مجازی خود را با نسخهی 1.0 آن ماژول داشته باشد، در حالی که برنامهی B از محیط مجزایی با نسخهی 2.0 استفاده کند. اگر بعدها برنامهی B به ارتقای آن کتابخانه به نسخهی 3.0 نیاز داشته باشد، این تغییر هیچ تأثیری بر محیط برنامهی A نخواهد داشت.
12.2. ایجاد محیطهای مجازی¶
ماژولی که برای ایجاد و مدیریت محیطهای مجازی استفاده میشود، venv نام دارد. ماژول venv همان نسخهای از پایتون را نصب میکند که دستور با آن اجرا شده است (همانطور که با گزینهی --version گزارش میشود). برای مثال، اگر دستور را با python3.12 اجرا کنید، نسخهی 3.12 نصب خواهد شد.
برای ایجاد یک محیط مجازی، ابتدا پوشه موردنظر خود را انتخاب کنید و سپس ماژول venv را بهصورت یک اسکریپت همراه با مسیر آن پوشه اجرا کنید:
python -m venv tutorial-env
اگر پوشه tutorial-env وجود نداشته باشد، این دستور آن را ایجاد میکند و همچنین درون آن پوشههایی شامل یک نسخه از مفسر پایتون و پروندههای پشتیبان موردنیاز را میسازد.
یکی از محلهای رایج برای ایجاد محیط مجازی، پوشه .venv است. این نام معمولاً باعث میشود پوشه در پوسته مخفی بماند و در عین حال بهخوبی نشان دهد که دلیل وجود آن چیست. همچنین از تداخل با پروندههای تعریف متغیرهای محیطی .env که برخی ابزارها از آنها پشتیبانی میکنند، جلوگیری میکند.
پس از ایجاد محیط مجازی، میتوانید آن را فعال کنید.
در ویندوز، دستور زیر را اجرا کنید:
tutorial-env\Scripts\activate
در یونیکس یا macOS، دستور زیر را اجرا کنید:
source tutorial-env/bin/activate
(این اسکریپت برای پوسته bash نوشته شده است. اگر از پوستههای csh یا fish استفاده میکنید، باید بهترتیب از اسکریپتهای activate.csh یا activate.fish استفاده کنید.)
با فعال کردن محیط مجازی، اعلان پوسته تغییر میکند تا نشان دهد از کدام محیط مجازی استفاده میکنید. همچنین محیط بهگونهای تنظیم میشود که با اجرای دستور python، همان نسخه و نصب پایتون مربوط به آن محیط مجازی اجرا شود. برای مثال:
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
توجه داشته باشید که محیط مجازی فعالشده، متغیر PYTHONPATH را به هیچوجه تغییر نمیدهد. اگر این مسیر شامل ارجاعهایی به کدی باشد که با نسخه پایتونی که محیط مجازی استفاده میکند سازگار نیست، ممکن است به نتایج غیرمنتظرهای منجر شود. بهترین روش این است که در bash یا معادل آن در پوستهای که استفاده میکنید، این متغیر را با دستور unset PYTHONPATH حذف کنید.
برای غیرفعال کردن محیط مجازی، دستور زیر را وارد کنید:
deactivate
در پایانه.
12.3. مدیریت بستهها با pip¶
میتوانید با استفاده از برنامهای به نام pip بستهها را نصب، بهروزرسانی و حذف کنید. بهطور پیشفرض، pip بستهها را از Python Package Index نصب میکند. همچنین میتوانید با مراجعه به این وبسایت در مرورگر خود، بستههای موجود در Python Package Index را مرور کنید.
pip دارای چندین زیرفرمان مانند «install»، «uninstall»، «freeze» و موارد دیگر است. (برای مشاهدهی مستندات کامل pip به راهنمای نصب ماژولهای پایتون مراجعه کنید.)
میتوانید با مشخص کردن نام یک بسته، آخرین نسخهی آن را نصب کنید:
(tutorial-env) $ python -m pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
همچنین میتوانید با نوشتن نام بسته، سپس == و شمارهی نسخه، نسخهی مشخصی از آن را نصب کنید:
(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
اگر این دستور را دوباره اجرا کنید، pip تشخیص میدهد که نسخهی درخواستی از قبل نصب شده است و هیچ کاری انجام نمیدهد. میتوانید شمارهی نسخهی دیگری را مشخص کنید تا همان نسخه نصب شود، یا با اجرای python -m pip install --upgrade بسته را به آخرین نسخه ارتقا دهید:
(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
دستور python -m pip uninstall که پس از آن یک یا چند نام بسته آورده میشود، آن بستهها را از محیط مجازی حذف میکند.
دستور python -m pip show اطلاعات مربوط به یک بستهی مشخص را نمایش میدهد:
(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
دستور python -m pip list فهرست تمام بستههای نصبشده در محیط مجازی را نمایش میدهد:
(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
دستور python -m pip freeze نیز فهرستی مشابه از بستههای نصبشده تولید میکند، اما خروجی آن در قالبی است که دستور python -m pip install انتظار دارد. معمولاً این فهرست را در پروندهای با نام requirements.txt ذخیره میکنند:
(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
سپس میتوان پرونده requirements.txt را در سامانهی کنترل نسخه ثبت (commit) کرد و همراه با برنامه منتشر نمود. در این صورت، کاربران میتوانند با استفاده از install -r تمام بستههای موردنیاز را نصب کنند:
(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
...
Installing collected packages: novas, numpy, requests
Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
pip گزینههای بسیار بیشتری نیز دارد. برای مطالعهی مستندات کامل pip، به راهنمای نصب ماژولهای پایتون مراجعه کنید. همچنین، اگر بستهای نوشتهاید و میخواهید آن را در Python Package Index منتشر کنید، به Python packaging user guide مراجعه کنید.