۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

پایتون virtualenv و venv باید و نباید

محیط های مجازی پایتون برای جدا نگه داشتن پروژه ها و بسته های متضاد می درخشد. فقط این بایدها و نبایدها را در ذهن داشته باشید.

محیط های مجازی پایتون برای جدا نگه داشتن پروژه ها و بسته های متضاد می درخشد. فقط این بایدها و نبایدها را در ذهن داشته باشید.

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

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

Python با یک سیستم خودکار برای نگه داشتن یک بسته به صورت محلی برای یک پروژه پایتون ارائه می‌شود. محیط‌های مجازی پایتون – با اجازه ابزار virtualenv در پایتون ۲ و venv در پایتون ۳ – می‌توان برای ایجاد یک نمونه مجزا و مجزا از زمان اجرای Python برای یک پروژه، با مکمل های خاص خود.

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

از محیط های مجازی پایتون استفاده کنید 

اولین اشتباه رایجی که برنامه نویسان پایتون با virtualenv یا venv مرتکب می شوند این است که با آن زحمتی نمی کشند. اگر تنها کاری که انجام می دهید جمع آوری یک اسکریپت سریع و کثیف برای انجام یک کار کوچک است، چرا اصلاً به خود زحمت ایجاد یک محیط مجازی را بدهید؟

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

برخی افراد نیز با استفاده از virtualenv یا venv بینی خود را چروک می‌کنند زیرا هر محیط مجازی کپی کوچک خود از زمان اجرا پایتون است که حدود ۲۵ مگابایت را اشغال می‌کند. اما فضای دیسک این روزها به طرز مضحکی ارزان است، و حذف یک محیط مجازی به سادگی حذف دایرکتوری آن (بدون عوارض جانبی) است. به علاوه، اگر چندین کار دارید که یک مجموعه مشترک از بسته‌ها را به اشتراک می‌گذارند، می‌توانید از همان محیط مجازی برای آن وظایف استفاده کنید. (با این حال، این فقط در صورتی کار می کند که مجموعه بسته  کاملاً سازگار باشد و هیچوقت تغییر نکند؛ بعداً در این مورد بیشتر توضیح خواهیم داد.)

از virtualenvwrapper برای مدیریت محیط های مجازی پایتون استفاده کنید

یکی از راه‌های کاهش بار محیط‌های مجازی، استفاده از virtualenvwrapper است. این ابزار به شما امکان می دهد تمام محیط های مجازی در فضای کاری خود را از طریق یک برنامه خط فرمان مرکزی مدیریت کنید.

یک توصیه در مورد ایجاد محیط های مجازی: دایرکتوری محیط مجازی خود را نام ندهید venv—یا در این مورد، نام هر بسته دیگری را که می خواهید در فضای مجازی استفاده کنید. محیط. این می تواند بعداً تأثیرات غیرقابل پیش بینی بر واردات داشته باشد. از نامی استفاده کنید که پروژه شما را بدون ابهام توصیف کند.

محیط های مجازی را بین پروژه ها به اشتراک نگذارید

اگر چندین پروژه دارید که تقریباً نیازهای یکسانی دارند، ممکن است ایده خوبی به نظر برسد که یک محیط مجازی واحد ایجاد کنید که هر دو پروژه بتوانند به اشتراک بگذارند. این کار را نکنید.

این به دلایل زیادی ایده بدی است، اما دو مورد کافی است. یکی، بسیار محتمل است که یکی از پروژه های مورد نظر به طور ناگهانی الزاماتی داشته باشد که پروژه دیگر را شکست دهد. تمام هدف محیط های مجازی جداسازی هر پروژه از پروژه های دیگر و ویژگی های آنهاست.

دو، راحتی و فضای ذخیره شده دیسک حاشیه ای خواهد بود. اگر پروژه شما دارای فایل های requires.txt یا Pipfile است، تنظیم یک محیط مجازی برای پروژه و نصب آنچه که نیاز دارد با چند دستور بسیار ساده است. این نصب‌ها هزینه‌های یک‌باره دارند، بنابراین تلاش برای بهبود آن‌ها فایده‌ای ندارد.

اگر چندین پروژه دارید که از نسخه‌های یکسان بسته‌های مشابه استفاده می‌کنند، و این کار را به طور مداوم انجام می‌دهند، ممکن است بتوانید یک venv را بدون تأثیرات بد بین آنها به اشتراک بگذارید. اما این مستلزم آن است که شما به عنوان یک گروه از الزامات آن پروژه ها مطلع باشید.

بسته‌های بزرگ را در محیط‌ها به اشتراک بگذارید — اما با دقت

در اینجا مشکلی وجود دارد که در این عصر نصب بسته‌های بزرگ پایتون مانند TensorFlow رو به افزایش است. چه می‌شود اگر چندین پروژه داشته باشیم که همگی باید نسخه یکسانی از بسته‌ای را به اشتراک بگذارند که اتفاقاً واقعاً بزرگ است – مثلاً صدها مگابایت؟

یکی از راه‌های رسیدگی به این موضوع استفاده از یک ویژگی ناشناخته محیط مجازی پایتون است. به طور معمول، هنگام ایجاد، از دایرکتوری بسته های سایت نصب پایتون استفاده نمی کنند. برنامه‌هایی که در venv اجرا می‌شوند فقط می‌توانند بسته‌های نصب‌شده در venv را «ببینند».

اما، اگر یک venv با گزینه --system-site-packages  ایجاد کنید، برنامه‌هایی که در آن venv اجرا می‌شوند نیز می‌توانند بسته‌های نصب شده در نصب پایتون را ببینند.

>

به طور معمول، venvs این کار را انجام نمی‌دهند تا فضای نام بسته خود را تمیز نگه دارند. اما اگر این ویژگی را فعال کنید، می‌توانید از آن برای نصب چند بسته کلیدی در نصب اصلی استفاده کنید و اجازه دهید آنها با venvs به اشتراک گذاشته شوند. اگر به نسخه جدیدتری از بسته مورد نظر نیاز دارید، می‌توانید آن را به صورت محلی در venv نصب کنید، زیرا نسخه‌های بسته خود venv جایگزین آنچه در نصب اصلی وجود دارد می‌شود.

به خاطر داشته باشید، این راه حل تنها زمانی بهترین کار را دارد که:

  1. بسته مورد بحث واقعاً بزرگ است – باز هم صدها مگابایت – و نصب آن در چندین پروژه عملی نیست.
  2. شما با چندین پروژه سروکار دارید که همگی به آن بسته نیاز دارند.
  3. شما قصد دارید نسخه سازی آن بسته را در تمام آن پروژه ها ثابت نگه دارید. به طور کلی سخت‌ترین معیار برای برآورده کردن آن است، زیرا الزامات یک پروژه از نظر تئوری می‌تواند در هر زمانی تغییر کند. اما اگر این کار را کرد، همیشه می‌توانید یک نسخه محلی از بسته را که نسخه مورد نیاز را برآورده می‌کند، نصب کنید.

فایل های پروژه را در محیط مجازی پایتون قرار ندهید

هنگامی که یک محیط مجازی راه اندازی می کنید، دایرکتوری که در آن زندگی می کند قرار نیست چیزی جز خود محیط مجازی را در خود جای دهد. پروژه شما به درخت دایرکتوری جداگانه خود تعلق دارد. دلایل خوبی برای این وجود دارد:

  • درخت فهرست پروژه شما ممکن است دارای یک قرارداد نامگذاری باشد که با عناصر محیط مجازی برخورد می کند.
  • راه آسان برای حذف یک محیط مجازی، حذف دایرکتوری است. ادغام فایل های پروژه با محیط مجازی به این معنی است که ابتدا باید این دو را از هم جدا کنید.
  • بازنویسی چیزی در محیط مجازی بدون اطلاع از آن بسیار آسان است.
  • چند پروژه ممکن است از یک محیط مجازی استفاده کنند. (بعید است، همانطور که در بالا ذکر شد، اما ممکن است، و بنابراین ارزش آگاهی از آن را دارد.)

یک راه برای سازماندهی چیزها ایجاد یک دایرکتوری سطح بالا است که محیط های مجازی مختلف را در خود نگه می دارد و دایرکتوری سطح بالایی دیگری که پروژه ها را در خود نگه می دارد. تا زمانی که این دو از هم جدا باشند، این مهم است. اما رویکرد کلی، برای راحتی و ثبات، این است که venv را در داخل پروژه به‌عنوان دایرکتوری سطح بالا داشته باشید.

فراموش نکنید که محیط مجازی پایتون خود را فعال کنید 

یکی دیگر از اشتباهات رایج مردم در مورد محیط های مجازی این است که فراموش می کنند آنها را فعال کنند یا محیط های مناسب را فعال نمی کنند.

قبل از اینکه یک محیط مجازی بتواند در یک جلسه پوسته خاص استفاده شود، باید از طریق اسکریپتی به نام activate در  محیط مجازی فعال شود فهرست اسکریپت‌ها در venvs ایجاد شده در Microsoft Windows. در سیستم‌های POSIX مانند Linux و MacOS، bin نامیده می‌شود. پس از فعال‌سازی، محیط مجازی به عنوان نمونه پیش‌فرض پایتون تلقی می‌شود تا زمانی که آن را غیرفعال کنید (با اجرای دستور غیرفعال کردن)، یا تا زمانی که جلسه پوسته بسته شود.

فراموش کردن این مرحله در ابتدا آسان است، هم به این دلیل که عادتی است که باید کسب کنید و هم به این دلیل که اسکریپت فعال سازی در فهرست راهنمای محیط مجازی یک سطح پایین تر است. چند ترفند در اینجا مفید است:

  1. میانبرهایی برای اسکریپت های فعال سازی/غیرفعال سازی در دایرکتوری اصلی پروژه خود ایجاد کنید. می‌توانید آن میان‌برها را چیزی ساده مانند act و deact نامگذاری کنید تا تایپ کردن آنها کمتر منفور باشد.
  2. برای پروژه‌هایی که روی آنها از یک IDE کار می‌کنید و نه از خط فرمان، یک راه‌انداز پروژه – یک فایل دسته‌ای یا اسکریپت پوسته – برای برنامه Python مورد نظر ایجاد کنید. این به شما امکان می دهد اسکریپت فعال سازی را فراخوانی کنید، سپس اسکریپت خود را اجرا کنید. شما معمولاً نیازی به غیرفعال کردن محیط اسکریپت پس از اجرا ندارید، زیرا به هر حال جلسه به خودی خود خاتمه می یابد.

این ترفند آخر بر یک نکته مهم در مورد فعال‌سازی محیط مجازی تأکید می‌کند: این ترفند فقط برای جلسه محیطی که در آن اجرا می‌شود اعمال می‌شود.

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

بسیاری از IDE ها اکنون از شناسایی و فعال سازی خودکار یک محیط مجازی با یک پروژه پشتیبانی می کنند. مایکروسافت ویژوال استودیو کد، با پسوند پایتون خود مایکروسافت، این کار را انجام می دهد. هنگامی که یک پروژه را باز می کنید و سپس یک کنسول را در VS Code باز می کنید، هر محیط مجازی مرتبط با آن پروژه به طور خودکار در آن کنسول فعال می شود.

از >= برای پین کردن نسخه بسته در محیط مجازی پایتون استفاده نکنید

این نکته در خارج از محیط های مجازی نیز مفید است. وقتی برنامه ای با فایل requirements.txt دارید، باید بسته هایی را با شماره نسخه دقیق مشخص کنید. از تعریفی مانند mypackage==2.2 استفاده کنید، نه mypackage>=۲.۲.

دلیل این است: یکی از دلایل اصلی استفاده از یک محیط مجازی، اطمینان از استفاده از نسخه‌های خاص بسته‌ها است. اگر به جای == از >= استفاده می کنید، هیچ تضمینی وجود ندارد که شما یا شخص دیگری در صورت نیاز به ایجاد محیط برای آن، همان نسخه را داشته باشید. پروژه از یک شماره نسخه دقیق استفاده کنید. شما، شما آینده، و هر کس دیگری که بعد از شما بیاید، از شما تشکر می کنیم.