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 استفاده کنید.)

با فعال کردن محیط مجازی، اعلان (prompt) شل تغییر می‌کند تا نشان دهد از کدام محیط مجازی استفاده می‌کنید. همچنین محیط به‌گونه‌ای تنظیم می‌شود که با اجرای دستور 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']
>>>

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

deactivate

در ترمینال.

12.3. مدیریت بسته‌ها با pip

می‌توانید با استفاده از برنامه‌ای به نام pip بسته‌ها را نصب، به‌روزرسانی و حذف کنید. به‌طور پیش‌فرض، pip بسته‌ها را از Python Package Index نصب می‌کند. همچنین می‌توانید با مراجعه به این وب‌سایت در مرورگر خود، بسته‌های موجود در Python Package Index را مرور کنید.

pip دارای چندین زیرفرمان مانند «install»، «uninstall»، «freeze» و موارد دیگر است. (برای مشاهدهٔ مستندات کامل pip به راهنمای Installing Python modules مراجعه کنید.)

می‌توانید با مشخص کردن نام یک بسته، آخرین نسخهٔ آن را نصب کنید:

(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، به راهنمای Installing Python modules مراجعه کنید. همچنین، اگر بسته‌ای نوشته‌اید و می‌خواهید آن را در Python Package Index منتشر کنید، به Python packaging user guide مراجعه کنید.