کتابخانه را مستقیم با pip نصب میکنید و فکر میکنید فقط همین پروژه را میگیرد. اینطور نیست. روی پایتون کل سیستم مینشیند. پروژه بعدی همان نسخه را برمیدارد. دو پروژه با دو نسخه مختلف از یک کتابخانه با هم قاطی میشوند. محیط مجازی پایتون یک پوشه جدا برای همان پروژه است. قبل از نصب کتابخانه همان را بسازید.
چرا pip سراسری کتابخانهها را قاطی میکند
وقتی ترمینال را باز میکنید و مینویسید pip install، برنامه میرود سراغ پایتونی که برای کل کاربر نصب شده. کتابخانه همانجا ذخیره میشود. پوشه پروژه شما خالی میماند. فردا پروژه دیگر همان کتابخانه را صدا میزند، با همان نسخه. اگر نسخه را عوض کنید، پروژه قبلی میشکند.
خیلیها بعد از چند هفته همین را میبینند. اسکریپت دیروز کار میکرد. امروز خطا میدهد.
بعضیها برای رد شدن از خطا sudo pip میزنند. این کار را نکنید. کتابخانه با دسترسی مدیر روی سیستم مینشیند. پاک کردنش سخت میشود. گاهی ابزار خود سیستم هم بههم میخورد. اگر خطا داد که دسترسی نیست، مشکل از مدیر سیستم نیست. دارید روی پایتون سیستم نصب میکنید.
محیط مجازی پایتون را همین اول بسازید
پوشه پروژه را باز کنید. ترمینال را همانجا بیاورید. این فرمان را بزنید:
python3 -m venv .venv
یک پوشه به نام .venv ساخته میشود. داخلش یک پایتون جدا و یک pip جدا هست. کتابخانهها از این به بعد همینجا میمانند، نه روی سیستم.
اگر گفت python3 پیدا نشد، ببینید پایتون نصب است یا نه. روی بعضی سیستمها فرمان python است، نه python3. همان را امتحان کنید: python -m venv .venv. پوشه .venv را به گیت نفرستید. فقط مال سیستم خودتان است. در فایل gitignore همان نام را بنویسید.
اگر چند نسخه پایتون دارید، نسخه را صریح بگویید. مثلاً python3.12 -m venv .venv. یک پروژه یک پوشه .venv دارد. دو پروژه بیربط را در یک پوشه محیط نگذارید.
- پوشه پروژه را بسازید یا واردش شوید.
- بنویسید python3 -m venv .venv و صبر کنید تا پوشه ساخته شود.
- محیط را فعال کنید؛ فرمان فعالکردن در بخش بعد است.
- با pip install کتابخانه را نصب کنید.
- با pip freeze لیست را در فایل requirements.txt ذخیره کنید.
- کار که تمام شد deactivate بزنید.
اگر همین حالا پوشه پروژه را باز کردهاید، همان یک فرمان ساخت را بزنید و بگویید پوشه .venv ساخته شد یا خطا آمد.
فعالکردن در لینوکس، مک و ویندوز
تا فعال نکنید، pip هنوز مال سیستم است. ساختن پوشه کافی نیست. باید یک فرمان دیگر بزنید تا خط فرمان از پایتون داخل .venv استفاده کند.
لینوکس و مک
بنویسید source .venv/bin/activate. برای اطمینان which python را بزنید. مسیر باید داخل .venv باشد.
ویندوز
اگر cmd است بنویسید .venv\Scripts\activate.bat. اگر PowerShell است بنویسید .venv\Scripts\Activate.ps1. برای اطمینان where python را بزنید. مسیر باید داخل .venv باشد.
اگر اول خط، داخل پرانتز نام محیط آمد، فعال شده. معمولاً (.venv) دیده میشود. از این به بعد pip و python همان نسخه داخل پوشه را صدا میزنند. یک بار هم python --version را بزنید تا نسخه همان باشد که ساختید.
هر بار که ترمینال تازه باز میکنید، دوباره فعال کنید. پوشه میماند، ولی فعال بودن مال همان پنجره است. اگر پنجره را بستید، دفعه بعد دوباره source یا activate را بزنید.
نصب کتابخانه و ذخیره لیست
بعد از فعال شدن، کتابخانه را عادی نصب کنید. مثلاً:
pip install requests
نسخه داخل همین پوشه میآید. پروژه دیگر این را نمیبیند. اگر نسخه مشخص میخواهید، بنویسید pip install requests==2.32.3 تا همان نسخه قفل شود.
برای دیدن آنچه نصب شده بنویسید pip freeze. خروجی را در فایل بگذارید:
pip freeze > requirements.txt
این فایل را با پروژه نگه دارید. روی سیستم دیگر، بعد از ساخت و فعال کردن محیط، بنویسید:
pip install -r requirements.txt
همان کتابخانهها با همان نسخه نصب میشوند. این برای همکار یا برای خودتان روی لپتاپ دوم لازم است.
کار که تمام شد بنویسید deactivate. خط فرمان به حالت عادی برمیگردد. کتابخانهها در پوشه .venv میمانند؛ پاک نمیشوند. فقط دیگر pip سیستم را صدا میزنید. اگر خواستید از صفر شروع کنید، پوشه .venv را پاک کنید و دوباره بسازید. فایل requirements.txt را نگه دارید تا نصب تکرار شود.
سه اشتباه رایج
اول: پوشه را ساختید ولی فعال نکردید. pip install را زدید و کتابخانه باز روی سیستم رفت. همیشه اول خط را نگاه کنید. اگر (.venv) نیست، فعال کنید. بعد pip را بزنید.
دوم: sudo pip install. حتی داخل محیط هم لازم نیست. اگر خطا داد که دسترسی نیست، محیط فعال نیست یا pip اشتباه است. با which pip مسیر را چک کنید.
سوم: conda و این پوشه را با هم قاطی کردن. اگر از آناکوندا کار میکنید، محیط conda جدا بسازید. وسط کار از این روش به آن روش نپرید. برای یک پروژه یکی را انتخاب کنید و همان را نگه دارید.
الان pip را هنوز بدون محیط جدا میزنید، یا قبل از نصب کتابخانه پوشه .venv میسازید؟