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

قبل از این که بریم سراغ قسمت‌های دیگه کار با پکیج‌های پایتون باید یک کار خیلی مهم و یک قسمت مهم رو یاد بگیریم:یک سوالی که قبل از ادامه کار به ذهن ما می‌رسه اینه که پایتون چطوری پکیج‌های مختلف و ماژول‌های رو پیدا می‌کنه؟وقتی که شما می‌خواید یک پکیج یا ماژول رو import کنید پایتون روی سیستم شما دنبال سورسش می‌گرده و اون کد رو لود می‌کنه، اما سوالی که پیش میاد اینه که چطوری پایتون این کارو می‌کنه؟ و می‌دونه که کجارو دنبال بگرده؟جواب سوال اینه که پایتون path attribute ماژول استاندارد سیستم یا همون standard sys module رو چک می‌کنه که بهش sys.path هم می‌گندر عمل sys.path یک لیست از دایرکتوری‌ها هستش که وقتی ما می‌خوایم یک پکیج یا ماژول رو import کنیم اول داخل دایرکتوری اول رو نگاه می‌کنه و اگر نبود یک مرحله میره داخل‌تر و sub directory رو چک می‌کنه تا جایی که دیگه sub directory ای برای چک کردن نباشه و اون زمان ImportError رو به ما میده که یعنی نتونسته چیزی که ما می‌خوایم رو پیدا کنههم‌چنین یک نکته جالب دیگه هم در مورد این سرچ کردن هست و اونم اینه که اولین match شدن رو به عنوان نتیجه به ما برمی‌گردونهبه عنوان مثال من پایتون ۳.۱۰ و لیست دایرکتوری‌هاش رو در تصویر زیر نمایش دادمPython3.10 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