منابع ترجمه · The Python Tutorial · فصل ۱۲

محیط‌های مجازی و بسته‌ها (آموزش رسمی پایتون، فصل ۱۲)

۵ دقیقه مطالعه · به‌روزرسانی ۳ آبان ۱۴۰۵

منبع اصلی: The Python Tutorial, Chapter 12: Virtual Environments and Packages — Python Software Foundation

💡 این صفحه مثل یک نوت‌بوک Jupyter است: متغیر و تابعی که در یک سلول تعریف شود، در سلول‌های بعدی همین صفحه در دسترس است. سلول‌ها را به ترتیب اجرا کنید، یا با «⏮ تا اینجا» همهٔ سلول‌های قبلیِ اجرانشده را یک‌جا اجرا کنید.

۱۲٫۱. مقدمه

برنامه‌های پایتون اغلب از بسته‌ها و ماژول‌هایی استفاده می‌کنند که جزو کتابخانهٔ استاندارد نیستند. گاهی یک برنامه به نسخهٔ مشخصی از یک کتابخانه نیاز دارد، چون ممکن است به رفع یک باگ خاص وابسته باشد یا با نسخه‌ای منسوخ از رابط کتابخانه نوشته شده باشد.

این یعنی ممکن است یک نصب پایتون نتواند نیازهای همهٔ برنامه‌ها را برآورده کند. اگر برنامهٔ A به نسخهٔ ۱٫۰ یک ماژول و برنامهٔ B به نسخهٔ ۲٫۰ همان ماژول نیاز داشته باشد، نیازها با هم تعارض دارند و نصب هر کدام از نسخه‌های ۱٫۰ یا ۲٫۰ یکی از برنامه‌ها را از کار می‌اندازد.

راه‌حل این مشکل ساختن یک محیط مجازی (virtual environment) است: یک درخت پوشهٔ مستقل که شامل یک نصب پایتون برای یک نسخهٔ مشخص به‌علاوهٔ تعدادی بستهٔ اضافی است.

برنامه‌های مختلف می‌توانند از محیط‌های مجازی متفاوتی استفاده کنند. برای حل مثال تعارض بالا، برنامهٔ A می‌تواند محیط مجازی خودش را با نسخهٔ ۱٫۰ داشته باشد و برنامهٔ B محیط دیگری با نسخهٔ ۲٫۰. اگر برنامهٔ B بخواهد کتابخانه‌ای را به نسخهٔ ۳٫۰ ارتقا دهد، این کار روی محیط برنامهٔ A تأثیری ندارد.

۱۲٫۲. ساختن محیط‌های مجازی

ماژولی که برای ساختن و مدیریت محیط‌های مجازی به کار می‌رود venv نام دارد. venv همان نسخه‌ای از پایتون را نصب می‌کند که دستور با آن اجرا شده است (همان‌طور که گزینهٔ --version گزارش می‌کند). مثلاً اجرای دستور با python3.12 نسخهٔ ۳٫۱۲ را نصب می‌کند.

برای ساختن یک محیط مجازی، پوشه‌ای را که می‌خواهید در آن قرار بگیرد انتخاب کنید و ماژول venv را به‌صورت اسکریپت با مسیر آن پوشه اجرا کنید:

python -m venv tutorial-env

این دستور در صورت نبودن، پوشهٔ tutorial-env را می‌سازد و درون آن نیز پوشه‌هایی شامل یک نسخه از مفسر پایتون و فایل‌های پشتیبان گوناگون ایجاد می‌کند.

یک مکان رایج برای محیط مجازی پوشهٔ .venv است. این نام معمولاً پوشه را در shell شما پنهان نگه می‌دارد و در عین حال نامی دارد که دلیل وجود آن را توضیح می‌دهد. همچنین از تداخل با فایل‌های تعریف متغیر محیطی .env که برخی ابزارها پشتیبانی می‌کنند جلوگیری می‌کند.

پس از ساختن محیط مجازی می‌توانید آن را فعال (activate) کنید.

در ویندوز اجرا کنید:

tutorial-env\Scripts\activate

در یونیکس یا macOS اجرا کنید:

source tutorial-env/bin/activate

(این اسکریپت برای shell از نوع bash نوشته شده است. اگر از csh یا fish استفاده می‌کنید، به‌جای آن باید از اسکریپت‌های جایگزین activate.csh و activate.fish استفاده کنید.)

فعال‌سازی محیط مجازی، اعلان (prompt) shell شما را طوری تغییر می‌دهد که نشان دهد از کدام محیط مجازی استفاده می‌کنید، و محیط را طوری تغییر می‌دهد که اجرای 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 (یا معادل آن در shell خودتان) را اجرا کنید.

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

deactivate

۱۲٫۳. مدیریت بسته‌ها با pip

می‌توانید با برنامه‌ای به نام pip بسته‌ها را نصب، ارتقا و حذف کنید. به‌طور پیش‌فرض pip بسته‌ها را از 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 را در سیستم کنترل نسخه ثبت کرد و به‌عنوان بخشی از برنامه منتشر نمود. کاربران می‌توانند با 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 گزینه‌های بسیار بیشتری دارد. برای مستندات کامل آن راهنمای نصب ماژول‌های پایتون را ببینید. وقتی بسته‌ای نوشتید و خواستید آن را در Python Package Index در دسترس قرار دهید، به راهنمای کاربر بسته‌بندی پایتون مراجعه کنید.