Python پایتون ۳.۱۴
فصل ۱۲

محیط‌های مجازی و بسته‌ها (Virtual Environments and Packages)

📖 ۱۰ دقیقه 🎯 متوسط 🔄 ۲۰۲۶

۱۲.۱. مقدمه

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

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

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

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

۱۲.۲. ایجاد محیط‌های مجازی

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

برای ایجاد یک محیط مجازی، دایرکتوری را که می‌خواهید آن را در آنجا قرار دهید انتخاب کنید و پیمانهٔ venv را به‌عنوان یک اسکریپت با مسیر دایرکتوری اجرا کنید:

$ python -m venv tutorial-env

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

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

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

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

$ tutorial-env\Scripts\activate

در یونیکس یا مک‌اواس، اجرا کنید:

$ 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']
>>>

توجه داشته باشید که محیط مجازی فعال‌شده به هیچ وجه متغیر PYTHONPATH را تغییر نمی‌دهد. این ممکن است منجر به نتایج غیرمنتظره‌ای شود اگر مسیر شامل ارجاعاتی به کدی باشد که با نسخهٔ پایتونی که محیط مجازی از آن استفاده می‌کند ناسازگار است. بهترین روش این است که در bash از unset PYTHONPATH یا معادل آن در پوسته‌ای که استفاده می‌کنید، بهره ببرید.

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

$ 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 را در سیستم کنترل نسخه ثبت (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 به راهنمای نصب پیمانه‌های پایتون مراجعه کنید. هنگامی که یک بسته نوشته‌اید و می‌خواهید آن را در فهرست بسته‌های پایتون در دسترس قرار دهید، به راهنمای کاربر بسته‌بندی پایتون مراجعه کنید.