ویرگول
ورودثبت نام
Pooya Dowlat Abadi
Pooya Dowlat Abadi
خواندن ۳ دقیقه·۳ سال پیش

برنامه‌های سازمان یافته‌تر در پایتون - قسمت دوم - پیدا کردن پکیج‌ها

قبل از این که بریم سراغ قسمت‌های دیگه کار با پکیج‌های پایتون باید یک کار خیلی مهم و یک قسمت مهم رو یاد بگیریم:
یک سوالی که قبل از ادامه کار به ذهن ما می‌رسه اینه که پایتون چطوری پکیج‌های مختلف و ماژول‌های رو پیدا می‌کنه؟

وقتی که شما می‌خواید یک پکیج یا ماژول رو import کنید پایتون روی سیستم شما دنبال سورسش می‌گرده و اون کد رو لود می‌کنه، اما سوالی که پیش میاد اینه که چطوری پایتون این کارو می‌کنه؟ و می‌دونه که کجارو دنبال بگرده؟

جواب سوال اینه که پایتون path attribute ماژول استاندارد سیستم یا همون standard sys module رو چک می‌کنه که بهش sys.path هم می‌گن

در عمل sys.path یک لیست از دایرکتوری‌ها هستش که وقتی ما می‌خوایم یک پکیج یا ماژول رو import کنیم اول داخل دایرکتوری اول رو نگاه می‌کنه و اگر نبود یک مرحله میره داخل‌تر و sub directory رو چک می‌کنه تا جایی که دیگه sub directory ای برای چک کردن نباشه و اون زمان ImportError رو به ما میده که یعنی نتونسته چیزی که ما می‌خوایم رو پیدا کنه

هم‌چنین یک نکته جالب دیگه هم در مورد این سرچ کردن هست و اونم اینه که اولین match شدن رو به عنوان نتیجه به ما برمی‌گردونه

به عنوان مثال من پایتون ۳.۱۰ و لیست دایرکتوری‌هاش رو در تصویر زیر نمایش دادم

Python3.10 sys.path
Python3.10 sys.path

ولی اگه پایتون ۳ که توی لینوکس به پایتونی که توسط پکیج‌ها استفاده میشه این دستور رو بزنیم آیا متفاوت خواهد بود؟

Python3.9 sys.path
Python3.9 sys.path

خب توجه کنیم که sys.path یک لیسته مثل بقیه لیست‌ها پس می‌تونیم از روش slicing و index بندی داخلش استفاده کنیم

>>importsys>>>sys.path['','/usr/lib/python310.zip','/usr/lib/python3.10','/usr/lib/python3.10/lib-dynload','/usr/local/lib/python3.10/dist-packages','/usr/lib/python3/dist-packages']"> >>>importsys>>>sys.path['','/usr/lib/python310.zip','/usr/lib/python3.10','/usr/lib/python3.10/lib-dynload','/usr/local/lib/python3.10/dist-packages','/usr/lib/python3/dist-packages']

یعنی که می‌تونیم مقدار sys.path[0] که برابر '' هستش رو نمایش بدیم یا کارهای این شکلی باهاش انجام بدیم

البته سوالی که شاید پیش بیاد برای شما اینه که چرا sys.path[0] برابر با ' ' یا همون خالی هستش؟

جوابش اینه که چون پایتون رو با آرگومان خاصی اجرا نکردیم و دستور python3 یا python3.10 رو خالی بدون هیچ پسوندی اجرا کردیم داره اعلام می‌کنه که پسوندی نداره

هم‌چنین نکته جالب دیگه‌ای که در مورد sys.path وجود داره اینه که sys.path[-5:] مقادیر استاندارد و پکیج‌های استاندارد رو نمایش می‌ده

تا این مرحله همه چیز تئوری بوده اما فرض کنید که می‌خوایم یک کار عملی انجام بدیم

فرض کنید که می‌خوایم یک پکیج یا یک دایرکتوری رو به sys.path اضافه کنیم

یک پروژه ایجاد می‌کنیم و داخلش یک directory ایجاد می‌کنیم و یک فایل پایتونی با اسم دلخواه خودمون می‌سازیم داخلش

من برای مثال یک پروژه با اسم Python-Organize ایجاد کردم که یک فولدر یا دایرکتوری با نام addsyspath می‌سازم که داخلش یک اسکریپت پایتونی با نام sysadd.py ایجاد کردم به صورت عکس زیر

حالا می‌خوایم اونو به sys.path اضافه کنیم

چرا این ارور رو میده؟ چون که داخل sys.path نیست هنوز

به محلی که پروژه رو ایجاد کردیم cd می‌کنیم و اون رو به sys.path اضافه می‌کنیم

قبلا گفتیم که sys.path یک لیست هستش در واقع پس برای اضافه کردن یک آیتم به اون هم مثل هر لیست دیگه‌ای عمل می‌کنیم

sys.path.append(&quotaddsyspath&quot)

خب حالا این دایرکتوری اضافه شد و می‌تونیم ماژول مورد نظرمون یعنی sysadd رو اضافه کنیم

و با دستور زیر اونو import می‌کنیم

from addsyspath import sysadd

اگه کارهارو درست انجام داده باشیم باید با پیام Added To Syspath که قبلا تعریف کردیم رو به رو میشیم

خب شاید این روش چندان خوب نباشه و بخوایم پروژه‌ای که ایجاد کردیم رو بدون نوشتن و اجرا کردن این دستورات داشته باشیم

اینجا جایی هست که PYTHONPATH به کار ما میاد، هنگامی که پایتون رو اجرا می‌کنیم به صورت استاندارد چیزهایی که در PYTHONPATH هستند به sys.path اضافه میشه

برای اضافه کردن یک path یا directory به ورژن ویندوزی پایتون لازمه که دستور زیر رو اجرا کنیم

set PYTHONPATH=path1;path2;path3

برای اضافه کردن توی لینوکس یا مک هم به صورت زیر انجام میشه

export PYTHONPATH=path1:path2:path3

اگر بخوایم این تغییرات رو سیو کنیم و هربار این دستورات رو اجرا نکنیم در ویندوز باید از environmental path استفاده کنیم

توی لینوکس و مک هم می‌تونیم اونو به .bashrc یا .zshrc اضافه کنیم یا محل‌های دیگری مثل محل زیر اضافش کنیم:

nano /etc/bash.bashrc

امیدوارم این قسمت آموزش براتون مفید بوده باشه

قسمت قبلی رو در این لینک ببینید:

https://virgool.io/@pooyadowlat/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%B2%D9%85%D8%A7%D9%86-%DB%8C%D8%A7%D9%81%D8%AA%D9%87-%D8%AA%D8%B1-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-vedyhpyvlxhn

pythonpython3پایتونپایتون۳
شاید از این پست‌ها خوشتان بیاید