فهرست مطالب

"راهنمای pip و نصب پکیج در پایتون"

مقدمه🔗

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

برای اینکه خیلی درگیر جزییات نشویم فرض را بر این می‌گیریم که pip روی سیستم شما نصب است. فقط قبل از شروع توصیه می‌کنم که به صورت زیر یک virtual environment بسازید و وارد آن شوید تا تست‌ها و تمرینات باعث آسیب رساندن به پکیج‌های اصلی پایتون که به صورت سراسری توسط کل سیستم استفاده می‌شود، نشود. ابتدا ترمینال را باز کنید و با استفاده از دستور cd به دایرکتوری دلخواه بروید و سپس با mkdir یک فولدر بسازید و بعد دوباره با دستور cd وارد فولدر تازه ساخت شوید و دستورات زیر را اجرا کنید:

SHELL
$ python -m venv venv
$ source venv/bin/activate

در سطر اول، در دایرکتوری فعلی یک محیط مجازی پایتون می‌سازیم و با کد خط دوم آن محیط مجازی را فعال می‌کنیم. می‌توانید ‌venv دوم در دستور اول را به هر نامی که دوست دارید تغییر دهید. این نام در واقع نام فولدری است که virtual environment در آن ساخته می‌شود. بدیهی است که در این صورت در دستور دوم به جای venv باید نامی که انتخاب کرده‌اید را قرار دهید.

لیست پکیج‌های نصب شده🔗

با دستور pip list می‌توانیم کل پکیج‌های نصب شده را ببینیم. در اینجا چون یک virtual environment درست کرده‌ام می‌بینید که تنها دو پکیج در این محیط مجازی پایتون وجود دارد.

SHELL
$ pip list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0

نصب پکیج🔗

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

در کد زیر دستور نصب پکیج progressbar2 را به همراه خروجی pip می‌بینید.

SHELL
$ pip install progressbar2
Collecting progressbar2
  Downloading progressbar2-4.2.0-py2.py3-none-any.whl (27 kB)
Collecting python-utils>=3.0.0
  Downloading python_utils-3.5.2-py2.py3-none-any.whl (24 kB)
Installing collected packages: python-utils, progressbar2
Successfully installed progressbar2-4.2.0 python-utils-3.5.2

حالا دوباره دستور pip list را اجرا می‌کنیم. می‌خواهیم چیزی را ببینیم!

SHELL
$ pip list
Package      Version
------------ -------
pip          22.0.2
progressbar2 4.2.0
python-utils 3.5.2
setuptools   59.6.0

شاید متوجه شده باشید که python-utils 3.5.2 جز پکیج‌های نصب شده در سیستم نبود ولی الان هست. علت آن اینست که progressbar2 به آن نیاز دارد و pip این موضوع را می‌داند، لذا آن را هم نصب کرده است.

پیدا کردن اطلاعات پکیج🔗

گاهی وقت‌ها نیاز است ریز اطلاعات یک پکیج نصب شده را ببینیم. در این جور مواقع از دستور pip show package-name استفاده می‌کنیم.

اجازه دهید ببینیم چه اطلاعاتی را می‌توانیم از بسته‌ی progressbar2 استخراج کنیم.

SHELL
$ pip show progressbar2
Name: progressbar2
Version: 4.2.0
Summary: A Python Progressbar library to provide visual (yet text based) progress to long running operations.
Home-page: https://github.com/WoLpH/python-progressbar
Author: Rick van Hattem (Wolph)
Author-email: wolph@wol.ph
License: BSD
Location: /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages
Requires: python-utils
Required-by:

نام، ورژن، توضیح مختصری در مورد آن، نام و ایمیل نویسنده‌، لایسنس و آدرس وبسایت و نیز محل قرار گیری فایل‌های پکیج در سیستم قابل مشاهده است. به خط highlight شده توجه کنید. در مثال بالا گفتیم که progressbar2 به python-utils نیاز دارد و به همین خاطر آن را نصب کرده است. این موضوع را اینجا به صراحت می‌بینیم. در خط آخر می‌گوید که در حال حاضر هیچ پکیج دیگری برای عملکردش به progressbar2 احتیاج ندارد.

بیایید نکته بالا را این بار از طرف پکیج python-utils ببینیم و جزییات آن را نمایش دهیم:

SHELL
$ pip show python-utils
Name: python-utils
Version: 3.5.2
Summary: Python Utils is a module with some convenient utilities not included with the standard Python install
Home-page: https://github.com/WoLpH/python-utils
Author: Rick van Hattem
Author-email: Wolph@wol.ph
License: BSD
Location: /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages
Requires: 
Required-by: progressbar2

خط آخر می‌گوید که پکیج progressbar2 به python-utils احتیاج دارد.

توجه

Requires و Required-by دو قسمت مهم خروجی دستور pip show package-name هستند که اطلاعات مفیدی در مورد وابستگی‌ها یا dependencies پکیج می‌دهند.

نصب ورژن خاصی از یک پکیج🔗

pip به طور طبیعی آخرین نسخه‌ی پکیج را نصب می‌کند ولی می‌توان آن را واداشت که دقیقا نسخه‌ی خاصی را نصب کند. در زمان نوشتن این متن آخرین نسخه‌ی پکیج requests شماره 2.28.2 است ولی من در اینجا به صورت زیر 2.25.1 را نصب می‌کنم.

SHELL
$ pip install requests==2.25.1

حالا اطلاعات پکیج نصب شده را در کد زیر ببینیم. خط Version که highlight شده است 2.25.1 را نشان می‌دهد و خط Requires پکیج‌هایی را نشان می‌دهد که این پکیج به آن‌ها نیاز دارد و لذا دستور نصب بالا، آن‌ها را هم نصب کرده است.

SHELL
$ pip show requests
Name: requests
Version: 2.25.1
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages
Requires: certifi, chardet, idna, urllib3
Required-by:

حذف پکیج🔗

کارهای من معمولا آغاز دارد ولی پایان ندارد به همین خاطر progress برای من بی‌مفهوم است، پس بیایید پکیج progressbar آن هم از نوع «دو»اش را حذف کنیم. در موقع حذف، دستور از شما می‌خواهد که انجام عملیات را تایید کنید. در صورتی که هنوز از حذف پکیج منصرف نشده‌اید کلید y را بزنید.

SHELL
$ pip uninstall progressbar2
Found existing installation: progressbar2 4.2.0
Uninstalling progressbar2-4.2.0:
  Would remove:
    /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages/progressbar/*
    /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages/progressbar2-4.2.0.dist-info/*
Proceed (Y/n)? y
  Successfully uninstalled progressbar2-4.2.0

گرچه خط آخر به صراحت می‌گوید که پکیج مربوطه حذف شده ولی باز هم بیایید پکیج‌های نصبی را لیست کنیم و ببینیم که progressbar2 در لیست پکیج‌ها نیست:

SHELL
$ pip list
Package      Version
------------ ---------
certifi      2022.12.7
chardet      4.0.0
idna         2.10
pip          22.0.2
python-utils 3.5.2
requests     2.25.1
setuptools   59.6.0
urllib3      1.26.15

یادتان هست که گفتیم progressbar2 به python-utils احتیاج دارد و حتی وقتی جزییات این پکیج‌ها را با دستور pip show progressbar2 و pip show python-utils دیدیم توانستیم در قسمت Requires و Required-by این موضوع را تصدیق کنیم؟ حالا progressbar2 را حذف کرده‌ایم ولی می‌بینیم که python-utils هنوز در لیست پکیج‌هاست. بیایید ببینیم که آیا pip آن قدر هوشمند است که بفهمد چون progressbar2 حذف شده پس دیگر پکیجی به نام progressbar2 به python-utils وابسته نیست؟ کافیست جزییات پکیج python-utils را با کد زیر که بارها استفاده کرده‌ایم ببینیم:

SHELL
$ pip show python-utils
Name: python-utils
Version: 3.5.2
Summary: Python Utils is a module with some convenient utilities not included with the standard Python install
Home-page: https://github.com/WoLpH/python-utils
Author: Rick van Hattem
Author-email: Wolph@wol.ph
License: BSD
Location: /home/mohsen/Documents/programming/tests/pip/venv/lib/python3.10/site-packages
Requires: 
Required-by:

خط آخر را ببینید. دیگر در قسمت Required-by پکیج python-utils، پکیجی به نام progressbar2 نیست.

پیدا کردن پکیج‌هایی که مورد نیاز هیچ پکیجی نیستند🔗

برای اینکه لیست پکیج‌هایی که هیچ پکیج دیگری به آن‌ها نیاز ندارد را بیابیم به شیوه‌ی زیر عمل می‌کنیم. الان می‌دانیم که python-utils یقینا باید در این لیست باشد.

SHELL
$ pip list --not-required
Package      Version
------------ -------
pip          22.0.2
python-utils 3.5.2
requests     2.28.2
setuptools   59.6.0

در خط پنجم که highligh شده است python-utils را می‌بینید. علاوه بر این متوجه می‌شویم که غیر از این پکیج، پکیج‌های دیگری هم هستند که مورد نیاز هیچ پکیج دیگری نیستند. البته یادتان باشد که این مطلب فقط به این معنیست که پکیج‌های دیگر به این پکیج‌ها وابسته نیستند. خود ما ممکن است کدی نوشته باشیم که از این پکیج‌ها استفاده می‌کند و اگر سهوا آن‌ها را حذف کنید برنامه دچار مشکل خواهد شد.

پیدا کردن پکیج‌های قدیمی یا outdated🔗

برای اینکه بفهمیم کدام پکیج‌ها هستند که نسخه‌ی جدیدتری از آن‌ها منتشر شده است ولی ما هنوز با نسخه‌ی قدیمی آن کار می‌کنیم از دستور pip list به صورت زیر استفاده می‌کنیم. به مانند اکثر مثال‌های گذشته خط اول که highlight شده است دستور و باقی خطوط خروجی دستور است.

SHELL
$ pip list --outdated
Package    Version Latest Type
---------- ------- ------ -----
chardet    4.0.0   5.1.0  wheel
idna       2.10    3.4    wheel
pip        22.0.2  23.0.1 wheel
requests   2.25.1  2.28.2 wheel
setuptools 59.6.0  67.6.1 wheel

ستون Version شماره نسخه‌ی فعلی نصب شده در سیستم ما را نشان می‌دهد و ستون Latest آخرین نسخه‌ی منتشر شده‌، که قابل نصب است، را نمایش می‌دهد. به خط هفت که مربوط به پکیج requests است و آن را highlight کرده‌ایم نگاه کنید. در بخش بعدی به آن می‌پردازیم.

بروز رسانی یا upgrade پکیج🔗

خب! به خاطر دارید که برای اینکه ببینیم چطور می‌شود دقیقا نسخه‌ی خاصی از یک پکیج را نصب کرد، نسخه‌ای قدیمی از requests را نصب کردیم و در بخش قبل وقتی پکیج‌های outdated را لیست کردیم، دیدیم که نسخه‌ی جدیدتری از این پکیج موجود است. پس بیایید آن را upgrade کنیم:

SHELL
$ pip install --upgrade requests

خروجی‌های دستور به شما خواهد گفت که عملیات بروز رسانی موفقیت آمیز بوده است یا نه ولی بیایید از دانش pip و کمی هم خط فرمان لینوکس استفاده کنیم و ببینیم ورژن فعلی پکیج requests چیست.

SHELL
$ pip show requests | grep Version
Version: 2.28.2

عالی! requests را از نسخه‌ی 2.25.1 به 2.28.2، یعنی آخرین نسخه‌ی حال حاضر، ارتقا دادیم.

تمرین

بررسی کنید که آیا پکیج requests هنوز در لیست پکیج‌های قدیمی یا outdated هست یا نه.

لیست پکیج‌های بروز یا uptodate🔗

برای پیدا کردن لیست پکیج‌های بروز یا uptodate به شیوه‌ی زیر عمل می‌کنیم.

SHELL
$ pip list --uptodate
Package            Version
------------------ ---------
certifi            2022.12.7
charset-normalizer 3.1.0
python-utils       3.5.2
requests           2.28.2
urllib3            1.26.15

همان طوری که در خط هفتم که highlight شده است می‌بینید پکیج requests که کمی قبل آن را با دستور pip install --upgrade requests بروز رسانی کرده بودیم هم اکنون جزو لیست پکیج‌های بروز یا uptodate ماست.

نصب دسته جمعی پکیج‌ها🔗

بعضی پروژه‌ها دارای فایلی هستند که معمولا به نام requirements.txt نامگذاری می‌شود و دارای فرمتی به شکل زیر هستند:

requirements.txt
Bootstrap-Flask==2.2.0
Flask==2.2.3
flask-babel==3.0.1
camelcase==0.2
Markdown==3.4.3
Flask-WTF==1.1.1
email-validator==1.3.1

این فایل در واقع شامل لیست پکیج‌های لازم برای برنامه‌ی مورد نظر، همراه با ورژن دقیق هر پکیج است. اگر تمام پکیج‌های موجود در چنین فایلی را نصب کنید به احتمال ۹۹ درصد آن برنامه بی‌مشکل اجرا خواهد شد. آن یک درصد هم به خاطر این که همیشه امکان بروز مشکلات پیش‌بینی نشده وجود دارد. خب! هیچ کس انتظار ندارد که تک تک، هر خط را کپی کنیم و جلوی pip install پیست کنیم تا آن را نصب کند. پس یک راست سراغ دستور اصل کاری برویم:

SHELL
$ pip install -r requirements.txt

دستور بالا فایل قرار گرفته جلوی -r را می‌خواند و پکیج‌ها را بر اساس شرطی که معین کرده‌ایم نصب می‌کند. در این مثال شرط ما ساده است. ما درخواست نصب ورژن دقیق هر پکیج را داریم.

ساختن فایل requirements.txt برای پروژه‌ی خودمان🔗

چرا برای برنامه‌ای که خودمان نوشته‌ایم فایلی به نام requirements.txt ننویسیم و تمام پکیج‌های مورد نیاز برنامه‌مان را در آن قرار ندهیم. به این شیوه مطمئن هستیم که همه بی‌دردسر پکیج‌ها را نصب می‌کنند. با pip کار آسان است. فرض می‌کنیم که برای پروژه‌ virtual environment ساخته‌اید و پکیج‌های بی‌ربط به پروژه، لیست پکیج‌ها را شلوغ نکرده‌اند. در این صورت کافیست دستور زیر را اجرا کنید:

SHELL
$ pip freeze
Babel==2.12.1
Bootstrap-Flask==2.2.0
camelcase==0.2
certifi==2022.12.7
chardet==4.0.0
charset-normalizer==3.1.0
click==8.1.3
dnspython==2.3.0
email-validator==1.3.1
Flask==2.2.3
flask-babel==3.0.1
Flask-WTF==1.1.1
idna==2.10
itsdangerous==2.1.2
Jinja2==3.1.2
Markdown==3.4.3
MarkupSafe==2.1.2
python-utils==3.5.2
pytz==2022.7.1
requests==2.28.2
urllib3==1.26.15
Werkzeug==2.2.3
WTForms==3.0.1

می‌توانید خروجی دستور pip freeze را کپی کنید و در فایل requirements.txt قرار دهید و یا با استفاده از خط فرمان، مستقیما این کار را انجام دهید:

SHELL
$ pip freeze >requirements.txt

پایان مطلب و نتیجه‌گیری🔗

سعی کردم این مقاله را نه به شیوه‌ی نکته‌ای، بلکه به صورت راهنمای عملی و گام به گام بنویسم. در اینجا دستورات پایه‌ای pip را مطرح کردیم که با یادگیری و به کار بستنشان می‌توانید خیلی سریع راه خود را در درون دنیای pip و پکیج‌های پایتون باز کنید. pip فراتر از این مقاله و این دستورات است. سعی کنید یادداشت‌های دیگری را نیز، در مورد آن بخوانید و نکات جدید را فرا بگیرید. از دستور زیر غافل نباشید. شاید شما را از هر جستجویی بی‌نیاز کند!

SHELL
$ pip --help

شاد باشید.

نوشته شده در: 1402-01-17 (1 سال 7 ماه 2 هفته پیش)

من محسن هستم؛ برنامه‌نویس سابق PHP و Laravel و Zend Framework و پایتون و فلسک. تمرکزم بیشتر روی لاراول بود! الان از صفر مشغول مطالعات اقتصادی هستم.

برای ارتباط با من یا در همین سایت کامنت بگذارید و یا به dokaj.ir(at)gmail.com ایمیل بزنید.

در مورد این مطلب یادداشتی بنویسید.