ماژول‌ها و پکیج‌ها

pip freeze و requirements.txt: بازسازی محیط پایتون

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

در درس ماژول و پکیج دیدیم که می‌شود توابع خودمان را در یک فایل .py بگذاریم و import کنیم. دیگران هم دقیقاً همین کار را می‌کنند؛ با این تفاوت که کدشان را روی PyPI می‌گذارند تا همه بتوانند با pip install نصبش کنند.

کتابخانهٔ نصب‌شده کجاست؟

ماژول شخصی‌مان باید کنار فایل یا نوت‌بوکمان می‌بود. ولی وقتی یک پکیج را با pip نصب می‌کنید، فایلش کنار شما نیست:

pip install numpy

pip یک بار به اینترنت وصل می‌شود، پکیج را می‌گیرد و داخل پوشهٔ خود پایتون می‌گذارد. از آن به بعد، در هر پوشه و هر پروژه‌ای، import کار می‌کند:

import numpy as np

a = np.array([12, 6, 7])
print(a * 3)
[36 18 21]

دقت کنید a * 3 روی تک‌تک خانه‌ها ضرب شد — کاری که با لیست معمولی نمی‌شود. (NumPy موضوع درس‌های جداگانه‌ای است؛ اینجا فقط می‌خواستیم ببینیم یک کتابخانهٔ نصب‌شده چطور استفاده می‌شود.)

💡 الگوی import numpy as np همان import ... as درس قبل است. در دنیای پایتون این نام‌های کوتاه قراردادی‌اند: np برای NumPy، pd برای Pandas، st برای Streamlit.

pip freeze: چه چیزهایی نصب است؟

pip freeze

فهرست همهٔ پکیج‌های نصب‌شده را با شمارهٔ نسخهٔ دقیقشان می‌دهد:

numpy==2.5.4
pandas==3.0.6
requests==2.34.2
streamlit==1.66.0

(شماره‌ها روی سیستم شما احتمالاً فرق می‌کند؛ هر پکیج مدام نسخهٔ تازه می‌دهد.)

همین دستور ساده‌ترین راه چک‌کردن یک نصب است: بعد از pip install streamlit، اگر اسمش در خروجی pip freeze بود، نصب موفق بوده.

💡 pip list هم تقریباً همین کار را می‌کند، ولی خروجی‌اش جدول خوش‌فرم برای خواندن است. خروجی pip freeze برای ماشین است: دقیقاً همان قالبی که pip برای نصب می‌فهمد.

ریختن فهرست در فایل

حالا نکتهٔ اصلی. خروجی را می‌توانیم با > در یک فایل بریزیم:

pip freeze > requirements.txt

علامت > مال ترمینال است، نه پایتون: «خروجی این دستور را به‌جای صفحه، در این فایل بنویس». فایل در پوشهٔ فعلی ساخته می‌شود و محتوایش همان فهرست package==version است.

اسم requirements.txt یک قرارداد است، نه اجبار؛ ولی همه از همین اسم استفاده می‌کنند، پس هر برنامه‌نویسی که پروژهٔ شما را ببیند می‌فهمد این فایل چیست.

نصب دسته‌جمعی با یک دستور

روی کامپیوتر دیگر (یا سرور، یا وقتی ویندوز را عوض کرده‌اید)، به‌جای نصب تک‌تک پکیج‌ها:

pip install -r requirements.txt

-r یعنی «فهرست را از این فایل بخوان». pip خط‌به‌خط می‌رود و همه را با همان نسخه‌ها نصب می‌کند.

این الگو — یک فایل requirements.txt کنار کد، که در گیت هم ذخیره می‌شود — استاندارد کار تیمی و استقرار روی سرور است. کسی که پروژه را می‌گیرد لازم نیست حدس بزند چه چیزهایی باید نصب کند.

⚠️ pip freeze همهٔ پکیج‌های آن پایتون را می‌دهد، نه فقط آن‌هایی که این پروژه لازم دارد. اگر همه‌چیز را در یک پایتون مشترک نصب کرده باشید، فایلتان شلوغ می‌شود. راه‌حل درستش محیط مجازی (virtual environment) است: برای هر پروژه یک پایتون جدا. فعلاً همین‌قدر بدانید که چنین چیزی هست.

خلاصه

دستور کار
pip install X نصب پکیج X از PyPI
pip freeze فهرست پکیج‌های نصب‌شده با نسخه
pip freeze > requirements.txt ریختن همان فهرست در فایل
pip install -r requirements.txt نصب همهٔ پکیج‌های فهرست

تمرین

در ترمینال pip freeze بزنید و ببینید چند پکیج روی سیستمتان نصب است. بعد خروجی را در فایلی به اسم requirements.txt بریزید و فایل را با یک ویرایشگر متن باز کنید. آیا pip و setuptools هم در فهرست هستند؟

جواب
pip freeze
pip freeze > requirements.txt

خود pip هیچ‌وقت در خروجی pip freeze نیست، چون ابزار خود محیط پایتون است، نه وابستگی پروژهٔ شما. setuptools بستگی به نسخهٔ پایتون دارد: تا پایتون 3.11 مخفی می‌شود؛ از 3.12 به بعد اگر نصب باشد در فهرست می‌آید (هرچند در نصب‌های تازهٔ 3.12 به بعد معمولاً اصلاً نصب نیست). اگر بخواهید همه‌چیز را ببینید:

pip list

یک نکتهٔ کوچک هم: فهرستی که می‌گیرید معمولاً بلندتر از چیزی است که انتظار دارید. دلیلش این است که هر پکیجی خودش به پکیج‌های دیگری وابسته است و pip آن‌ها را هم نصب کرده است. مثلاً با نصب Streamlit، چیزهایی مثل altair، pillow و tornado هم می‌آیند.