درس ۰۳: ایجاد و اجرای پروژه

این درس به چگونگی ایجاد پروژه‌‌های برنامه‌نویسی پایتون و اجرای آن‌ها اختصاص یافته است. درس با بیان تعاریف و رسم ساختار معمول یک پروژه شروع و اشاره‌ای نیز به ساختار پروژه‌های قابل انتشار در PyPI می‌شود. در بخش یکم تلاش شده است که تصویر کاملی از ساختار یک پروژه در ذهن خواننده ایجاد و از این طریق او با تعاریف «بسته»، «ماژول» و «اسکریپت» در زبان پایتون آشنا شود. در دو بخش‌ بعدی نیز ضمن اشاره به دو شیوه‌ اجرای دستورات پایتون، به شیوه ایجاد اسکریپت و چگونگی اجرای آن تمرکز شده است؛ چرا که پروژه‌های پایتون به این شیوه اجرا می‌گردند. در ادامه هم به روند اجرای کد توسط مفسر پایتون و همچنین معرفی بایت‌کد توجه و در نهایت نیز به معرفی virtualenv و pyvenv پرداخته شده است.

سطح: پایه


ساختار پروژه

نخستین گام در توسعه‌ یک برنامه پایتون ایجاد یک پروژه است که پس از آن نوشتن کدها یا ایجاد سورس کد (Source code) برنامه آغاز می‌شود.

سورس کد یک پروژه به زبان پایتون در قالب یک یا چند «ماژول» (Module) توسعه می‌یابد که در سورس کدهایی با بیش از یک ماژول بهتر است ماژول‌هایی که از نظر منطقی با یکدیگر مرتبط هستند را درون دایرکتوری‌هایی مجزا قرار دهیم که به این نوع دایرکتوری‌ها در زبان پایتون «بسته» (Package) گفته می‌شود.

نکته

یک یا چند ماژول درون یک دایرکتوری مشخص تشکیل یک بسته را می‌دهند و هر بسته خود می‌تواند حاوی بسته‌(های) دیگری باشد.

توجه

از نسخه 3.3 پایتون با افزوده شدن ویژگی جدیدی به نام «بسته فضانام» (Namespace Package - PEP 420)، تعریف بسته پایتون به دو شاخه «بسته عادی» (Regular Package) که همان تعریف قدیمی از بسته می‌باشد و بسته فضانام گسترش یافته است. [در درس مربوط به ماژول‌ها بیشتر توضیح داده خواهد شد]

در تعریف زبان پایتون دو نوع ماژول وجود دارد:

۱- Pure Module (ماژول ناب)، همان تعریف عادی از ماژول پایتون است؛ فایل‌هایی با پسوند py که کد (تعاریف و دستورات) پایتون در آن‌ها نوشته می‌شوند.

۲- Extension Module (ماژول توسعه)، ماژول‌هایی که توسط زبان‌های برنامه‌نویسی دیگری به غیر از پایتون ایجاد شده‌اند. از درس یکم به خاطر داریم که پایتون یک زبان توسعه‌پذیر است و در کنار آن می‌توان از کد‌های نوشته شده با دیگر زبان‌های برنامه‌نویسی استفاده نمود: به مانند C و ++C در پیاده‌سازی CPython یا Java در پیاده‌سازی Jython یا #C در پیاده‌سازی IronPython - [ایجاد و استفاده از این نوع ماژول در درسی جداگانه بررسی خواهد شد.]

توجه

از این پس هر جایی از کتاب که گفته شود «ماژول» منظور Pure Module خواهد بود، مگر اینکه نام «ماژول توسعه» به صراحت ذکر گردد.

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

SampleProject
.
├── sample_project.py
├── module_one.py
└── pakage/
    ├── __init__.py
    ├── module_two.py
    └── module_three.py

نکته

در پایتون هر بسته‌ (عادی) می‌بایست حاوی فایل ویژه‌‌‌ init__.py__ باشد که البته الزامی به کدنویسی درون این فایل وجود ندارد. این فایل دایرکتوری خود را به عنوان یک بسته (محلی برای یافتن ماژول‌ها) به مفسر پایتون معرفی می‌کند.

در ایجاد سورس کد باید به صورتی عمل شود که با اجرای یک ماژول‌ مشخص تمام برنامه اجرا گردد. این ماژول معمولا هم نام پروژه در نظر گرفته و با عنوان «اسکریپت» (Script) از آن یاد می‌شود (اینجا:‌ sample_project.py). در واقع اسکریپت، ماژولی است که با هدف اجرای برنامه توسعه می‌یابد و ایجاد سورس کد نیز از آن شروع می‌گردد. از طرفی همانطور که می‌دانیم یکی از ویژگی‌های پایتون امکان برنامه نویسی ماژولار (Modular) است به این صورت که می‌توان کد‌های خود را بر حسب نیاز در ماژول‌هایی جداگانه نوشت و با وارد کردن (Import) آن‌ها در اسکریپت (یا ماژول‌های دیگر) از کد درون آن‌ها استفاده نمود. با این منطق می‌شود سورس کد یک پروژه از پایتون را تنها شامل یک اسکریپت تصور کرد که می‌تواند توسط تعدادی ماژول گسترش یابد؛ البته ممکن است ماژول‌ها نیز بر حسب نیاز در بسته‌هایی جداگانه قرار گرفته باشند.

نکته

[PEP 8]: در نام‌گذاری ماژول‌ها تنها از حروف کوچک استفاده می‌شود و در صورت نیاز می‌توان از کاراکتر خط زیرین (_) نیز استفاده نمود. نام بسته‌ها کوتاه بوده و از حروف کوچک تشکیل می‌گردد؛ استفاده از _ در نام بسته پیشنهاد نمی‌شود.

اکنون اطلاعات کافی برای شروع یک پروژه از پایتون را دارید ولی چنانچه می‌خواهید با ساختار مناسب پروژه‌ای که قرار است برای استفاده افراد دیگر از طریق PyPI یا سرویس‌هایی نظیر github.com منتشر شود (مانند یک کتابخانه کاربردی) آشنا شوید، ادامه این بخش را نیز مطالعه نمایید. در غیر این صورت می‌توانید به بخش بعدی از همین درس پرش نمایید.

جدا از سورس کد لازم است موارد دیگری نیز در ساختار این نوع پروژه‌ها در نظر گرفته شود؛ به ساختار پایین توجه نمایید:

SampleProject
.
├── docs/
├── LICENSE.txt
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── sampleproject/
│   ├── __init__.py
│   ├── module_one.py
│   ├── pakage/
│   │   ├── __init__.py
│   │   ├── module_two.py
│   │   └── module_three.py
│   ├── sample_project.py
│   └── test/
├── setup.cfg
└── setup.py

ساختار ابتدایی تنها شامل سورس کد می‌بود ولی در این ساختار تمام سورس کد در قالب یک بسته پایتون بخشی از مجموعه بزرگتری است که در آن یک سری فایل به مانند requirements.txt ،README.rst و setup.py به همراه دو دایرکتوری docs و test افزوده شده است. در ادامه کمی از کاربرد این موارد توضیح داده می‌شود ولی تاکید می‌شود که در حال حاضر نیازی به رعایت این ساختار نیست و در انتهای کتاب با ایجاد یک پروژه عملی و قرار دادن آن بر روی github.com و PyPI به صورت کاربردی با آن‌ها آشنا خواهید شد. [برای کسب اطلاعات بیشتر می‌توانید از اسناد پایتون استفاده نمایید]

setup.py: این فایل مهم دو کارکرد دارد: ۱- پیکربندی پروژه که از طریق آرگومان‌های تابع آماده ()setup درون این فایل صورت می‌پذیرد. ۲- یک رابط خط فرمان برای اجرای دستورات کاربردی مرتبط با پروژه (الگویی مشابه: <python setup.py <commands).

فهرست این دستورات از طریق وارد کردن دستوری مشابه python setup.py --help-commands قابل مشاهده است.

setup.cfg: ساختاری شبیه به یک فایل ini داشته و در صورت نیاز گزینه‌های مربوط به دستورات خط فرمان setup.py در این فایل تعریف می‌گردند. برای مشاهده فهرست گزینه‌های یک دستور مشخص می‌توانید از الگوی <python setup.py --help <commands پیروی نمایید.

README.rst: تمام پروژه‌ها می‌بایست شامل سندی برای توصیف خود باشند. در پایتون برای ایجاد اسناد معمولا از زبان نشانه‌گذاری reStructuredText استفاده می‌گردد و به همین دلیل این اسناد پسوند rst دارند که البته اجباری به این مورد نیست و می‌توانید برای ایجاد این فایل از Markdown (پسوند md) نیز استفاده نمایید.

MANIFEST.in: معمولا از این فایل برای معرفی فایل‌های غیر پایتونی موجود در پروژه استفاده می‌شود. زمانی که قصد ایجاد «سورس توزیع» یا sdist از پروژه را داشته باشید (دستوری مشابه: python setup.py sdist) تنها فایل‌های مشخصی از پروژه شناسایی می‌شوند و شناساندن باقی فایل‌ها (در صورت وجود) می‌بایست توسط این فایل (البته با الگویی خاص) انجام گیرد.

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

LICENSE.txt: این فایل پروانه‌ انتشار پروژه را شامل می‌شود و اغلب حاوی یک کپی از متن پروانه‌های متن باز رایج به مانند MIT ،GPL یا BSD می‌باشد.

توجه

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

docs: در این دایرکتوری اسناد (راهنما، آموزش و...) پروژه قرار داده می‌شوند. ایجاد این اسناد توسط Sphinx در درسی جداگانه بررسی خواهد شد.

test: این دایرکتوری محل نگهداری برنامه تست پروژه می‌باشد. ایجاد تست پروژه نیز در درسی جداگانه بررسی می‌گردد. این دایرکتوری می‌تواند هم در بالا ترین شاخه از پروژه و هم در داخل دایرکتوری سورس کد قرار داده شود.

با ایجاد یک توزیع (Distribution) از این ساختار و انتشار آن [که در آینده خواهید آموخت]، امکان نصب پروژه از طریق pip به وجود می‌آید. معمولا به جای واژه «توزیع» از واژه «بسته» (Package) استفاده می‌گردد؛ همانطور که pip نیز «سیستم مدیریت بسته پایتون» نامیده می‌شود و هیچگاه نباید آن را با مفهوم «بسته» که تا پیش از این مطرح شده است اشتباه گرفت.

ایجاد سورس کد

برای ایجاد فایل‌های سورس کد (ماژول‌ها و اسکریپت) نیاز به هیچ برنامه یا ابزار خاصی نیست و تنها با استفاده از یک ویرایشگر ساده متن (مانند برنامه Notepad در ویندوز) می‌توانید آن‌ها را ایجاد و ویرایش نمایید.

در ادامه پروژه‌ای به نام FirstProject که سورس کد آن تنها شامل یک اسکریپت است را ایجاد می‌نماییم. وظیفه این اسکریپت فرستادن حاصل عبارت 4÷(6×5-50) به خروجی (Output) خواهد بود.

برنامه‌ ویرایشگر متن پیش‌فرض سیستم عامل را اجرا نموده و به کمک آن یکی از کدهای پایین را (متناسب با نسخه پایتون مورد نظر خود) در فایلی با نام مشابه first_project و پسوند py نوشته و بر روی دیسک (در مسیر دایرکتوری Documents سیستم عامل) ذخیره می‌نماییم.

برای نسخه 2x، ساختار FirstProject و محتوای فایل first_project_2x.py را به صورت پایین در نظر می‌گیریم:

FirstProject
.
└── first_project_2x.py
1
2
3
4
5
6
7
#-*- coding: utf-8 -*-

# Python 2.x
# File Name: first_project_2x.py
# This script prints a value to the screen.

print "(50-5×6)÷4 =", (50-5*6)/4

و برای نسخه 3x، ساختار FirstProject و محتوای فایل first_project_3x.py را به صورت پایین در نظر می‌گیریم:

FirstProject
.
└── first_project_3x.py
1
2
3
4
5
# Python 3.x
# File Name: first_project_3x.py
# This script prints a value to the screen.

print("(50-5×6)÷4 =", (50-5*6)/4)

در بخش بعدی به اجرای سورس کد FirstProject خواهیم پرداخت؛ در این بخش بهتر است کمی به بررسی کدهای آن بپردازیم:

متن ماژول‌های پایتون 2x به صورت پیش‌فرض از استاندارد یونیکد (Unicode) پشتیبانی نمی‌کنند و توسط اسکی (ASCII) کدگذاری (Encoding) می‌شوند که تنها امکان استفاده از ۱۲۸ کاراکتر را می‌دهد. می‌توان با افزودن سطری مطابق الگوی -*- coding: encoding -*-# در ابتدای ماژول‌های پایتون (سطر یکم یا دوم) شیوه کدگذاری را به شکل دلخواه تعیین نماییم. [PEP 263]

بر همین اساس کدگذاری اسکریپت first_script_2x.py را به دلیل استفاده از کاراکترهایی خارج از مجموعه ASCII (÷ و ×) به UTF-8 تغییر داده‌ایم. پایتون 3x به صورت پیش‌فرض از استاندارد یونیکد پشتیبانی می‌کند.

در زبان پایتون هر متنی که بعد از کاراکتر ”Number sign“ یا # (در همان سطر) قرار بگیرد توسط مفسر پایتون نادیده گرفته می‌شود و تاثیری در روند ترجمه و اجرای کدها ندارد، به این نوع متن‌ «توضیح» (کامنت Comment) گفته می‌شود و از آن برای مستندسازی (Documentation) ماژول یعنی ارایه توضیح در مورد بخشی از کد استفاده می‌گردد. ارایه توضیح نقش زیادی در خوانایی ماژول دارد و کمک می‌کند تا افراد دیگر - حتی خودتان - بتوانند عملکرد کدهای ماژول (یا اسکریپت) شما را بفهمند.

توجه

کاراکتر نخست عبارت تعیین کدگذاری نیز # است ولی این سطر کامنت نبوده و درک آن برای مفسر با ارزش می‌باشد.

سطرهای خالی (Blank Lines) نیز توسط مفسر پایتون نادیده گرفته می‌شوند و تاثیری در روند ترجمه و اجرای کدها ندارند. استفاده درست از سطرهای خالی بر خوانایی کدهای ماژول می‌افزاید.

روش رایج فرستادن داده به خروجی (اینجا:‌ چاپ بر روی صفحه نمایش) در پایتون، استفاده از دستور print (در نسخه 2x) یا تابع ()print (در نسخه 3x) است. بارزترین تفاوت نسخه 3.0 پایتون با نسخه‌های پیش از خود،‌ تبدیل دستور print به تابع (Function) می‌باشد. برای تابع، داده درون پرانتز قرار داده می‌شود. [در درسی جداگانه به بررسی تابع‌ها در پایتون خواهیم پرداخت]

دستور (یا تابع) print توانایی دریافت هر تعداد داده و از هر نوع را دارد و در صورت دریافت یک عبارت محاسباتی (Arithmetic) یا منطقی (Logical) ابتدا حاصل آن را محاسبه یا ارزیابی کرده و پس از تبدیل به نوع داده string در خروجی قرار می‌دهد. در هنگام فرستادن چندین داده گوناگون به خروجی می‌بایست آن‌ها را توسط کاما (Comma) از یکدیگر جدا نماییم. در اینجا نیز print دو داده برای فرستادن به خروجی دریافت کرده است؛ یک نوع داده string و یک عبارت محاسباتی.

به دنباله‌ای از کاراکترها که بین دو نماد نقل قول (Quotation) یا " " محصور شده‌ باشند، string گفته می‌شود.

اجرای سورس کد

در حالت کلی به دو شیوه می‌توان به زبان پایتون کد نوشت و اجرا نمود: ۱- به حالت تعاملی (Interactive) با مفسر پایتون ۲- با ایجاد اسکریپت پایتون.

شیوه تعاملی: در این روش می‌بایست ابتدا دستور فراخوانی مفسر پایتون (حالت عمومی دستور: python) را در رابط خط فرمان سیستم عامل وارد نمایید؛ توسط این دستور خط فرمان وارد حالت تعاملی پایتون می‌شود و اکنون به سادگی می‌توانید شروع به کد‌نویسی نمایید. در این حالت هر کدی که وارد شود بلافاصله اجرا شده و در صورت لزوم نتیجه آن نیز نمایش داده می‌شود. از آنجا که در این روش امکان برگشت و ویرایش کدهای وارد شده وجود ندارد، در عمل زیاد کارآمد نبوده و از آن بیشتر در مواردی مانند گرفتن نتیجه‌ قطعه کدهای کوچک، اهداف آموزشی، دریافت راهنمایی یا ماشین حساب! استفاده می‌گردد. چگونگی کار با حالت تعاملی پایتون در درس بعدی بررسی می‌شود.

user> python
Python 2.7.9 (default, Jan 12 2015, 12:41:47)
[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> a = 3
>>> b = 2
>>> a * b
6
>>>

شیوه دیگر که موضوع همین بخش است، ایجاد اسکریپت می‌باشد. پیش از این با ایجاد سورس کد و اسکریپت آشنا شده ایم و می‌دانیم که اسکریپت، ماژولی است که برای اجرای سورس کد توسعه یافته و اجرای سورس کد همیشه از اسکریپت شروع می‌شود.

برای اجرای اسکریپت می‌بایست در خط فرمان سیستم عامل دستور فراخوانی مفسر پایتون را به همراه نام کامل اسکریپت (نشانی + نام + پسوند) وارد نمایید.

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

user> python2 Documents/FirstProject/first_project_2x.py
(50-5×6)÷4 = 5
user> python3 Documents/FirstProject/first_project_3x.py
(50-5×6)÷4 = 5.0

اگر به حاصل عبارت 4÷(6×5-50) در خروجی دو اسکریپت دقت کرده باشید حتما متوجه تفاوت آن شده‌اید. پایتون 2x حاصل تقسیم دو عدد صحیح (Integer) را به صورت یک عدد صحیح محاسبه و از مقدار بعد از ممیز (در صورت وجود) صرف نظر می‌کند ولی پایتون 3x همواره حاصل تقسیم را به صورت یک عدد اعشاری (Floating Point) و با دقتی بیشتر بر می‌گرداند. باز هم در این مورد صحبت خواهیم کرد.

نتیجه اجرای دو اسکریپت یاد شده در هر سیستم عاملی همان است که در بالا مشاهده می‌نمایید. چنانچه کاربر سیستم عامل ویندوز هستید به این نکته توجه داشته باشید که به دلیل وجود کاراکترهای خاصی (÷ و ×) که قرار است توسط print بر روی خط فرمان نمایش داده شوند و همچنین عدم پشتیبانی پیش‌فرض خط فرمان ویندوز از کدگذاری UTF-8، به هنگام اجرای اسکریپت خطایی گزارش می‌شود که ارتباطی با کد پایتون ندارد. در این مواقع پیشنهاد می‌شود از پایتون 3x و برنامه PowerShell استفاده نموده و پیش از اجرای اسکریپت دستور chcp 65001 را وارد نمایید - به صورت پایین:

PS > chcp 65001
Active code page: 65001

PS > python Documents\FirstProject\first_script_3x.py
(50-5×6)÷4 = 5.0

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

معمولا در گنولینوکس سطری به مانند پایین به ابتدای اسکریپت‌های پایتون (فقط در سطر یکم) اضافه می‌کنند، در این صورت به هنگام اجرا دیگر نیازی به فراخوانی مفسر پایتون نبوده و تنها می‌بایست پس از تغییر حالت (Mode) اسکریپت مورد نظر به حالت اجرا (توسط دستور chmod)، آن را به روش معمول در یونیکس اجرا نماییم:

1
#!/usr/bin/env python3

env یک دستور شل (Shell) یونیکس است که در زمان اجرای اسکریپت مفسر پایتون را می‌یابد و نشانی آن را جایگزین می‌کند. به جای استفاده از env می‌توان نشانی مفسر پایتون مورد نظر را به صورت صریح مانند usr/bin/python3/!# نوشت که البته در مواردی که پایتون به صورت جداگانه نصب شده باشد (نشانی مفسر در این حالت: usr/local/bin/python3/)، کارایی ندارد و موجب شکست در اجرا می‌گردد.

اکنون برای نمونه اگر اسکریپت first_script_2x.py را برای اجرا در گنولینوکس کامل‌تر سازیم:

1
2
3
4
5
6
7
8
#!/usr/bin/env python
#-*- coding: utf-8 -*-

# Python 2.x
# File: first_project_2x.py
# This script prints a value to the screen.

print "(50-5×6)÷4 =", (50-5*6)/4

پس از تغییر حالت، به دو صورت پایین می‌توان آن را در توزیع‌های گنولینوکس اجرا نمود:

user> chmod +x Documents/FirstProject/first_project_2x.py

user> Documents/FirstProject/first_project_2x.py
(50-5×6)÷4 = 5
user> cd Documents/FirstProject/

user> chmod +x first_project_2x.py

user> ./first_project_2x.py
(50-5×6)÷4 = 5

توجه

نباید نماد !# (shebang) را با نماد کامنت در پایتون (#) اشتباه گرفت.


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

  • PyDev: یک IDE کامل، متن باز و رایگان است که برای پلتفرم Eclipse ارایه می‌شود.
  • PyCharm: محصولی از شرکت فوق‌العاده JetBrains است که البته نسخه کامل آن فروشی است ولی نسخه کامیونیتی (Community) آن رایگان و متن باز می‌باشد که از بسیاری ویژگی‌ها و امکانات ویژه برخوردار است. (مقایسه نسخه‌ها)
  • NetBeans: یک IDE کامل، متن باز و رایگان است که طرفداران بسیاری دارد. NetBeans به صورت پیش‌فرض از پایتون پشتیبانی نمی‌کند و باید پلاگین مربوط به آن نصب گردد. (صفحه راهنمای نصب)

نکته

IDE یا Integrated development environment به ابزارهایی گفته می‌شود که علاوه‌بر یک ویرایشگر متن پیشرفته، امکانات بسیار کاربردی دیگری را نیز به مانند دیباگر (Debugger) در اختیار برنامه‌نویس قرار می‌دهد.

پشت صحنه اجرا

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

../_images/l03-interpreter.png

بایت‌کد هر ماژول‌ پایتون در قالب فایلی با پسوند pyc که یاد‌آور py Compiled است، ذخیره می‌گردد. این فایل در یک زیردایرکتوری با نام __pycache__ داخل همان دایرکتوری ماژول ذخیره می‌شود و نام گذاری آن نیز با توجه به نام ماژول و نسخه‌ مفسر پایتون مورد استفاده، انجام می‌گیرد (نمونه: module.cpython-34.pyc). مفسر پایتون از این فایل ذخیره شده جهت افزایش سرعت اجرا در آینده بهره خواهد برد؛ به این صورت که در نوبت‌های بعدی اجرا چنانچه تغییری در کدهای ماژول یا نسخه‌ مفسر پایتون صورت نگرفته باشد، مفسر با بارگذاری فایل بایت‌کد از کامپایل مجدد سورس کد به بایت‌کد صرف نظر می‌کند.

توجه

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

بایت‌کد سورس کدهایی که تنها شامل یک اسکریپت هستند در حافظه‌ (Memory) نگهداری می‌شود.

توجه

زمانی که به هر دلیلی (به مانند: عدم وجود فضای کافی) مفسر پایتون قادر به ذخیره‌ فایل بایت‌کد بر روی دیسک ماشین نباشد، مفسر بایت‌کد را داخل حافظه‌ قرار می‌دهد و مشکلی در اجرا به وجود نخواهد آمد. البته بدیهی است که پس از اتمام اجرا یا قطع ناگهانی منبع تغذیه، بایت‌کد حذف می‌گردد.

توجه

در نسخه‌های پیش از 3.2، دایرکتوری __pycache__ ایجاد نمی‌گردد و فایل بایت‌کد با نامی برابر نام ماژول و در همان دایرکتوری قرار داده می‌شود (نمونه: module.pyc). در این شیوه قدیمی علاوه بر وجود بی‌نظمی در میان فایل‌ها، تمایز بین ترجمه‌ نسخه‌های متفاوت مفسر پایتون نیز ممکن نمی‌باشد.

کدنویسی در حالت تعاملی را در درس بعدی خواهید آموخت ولی به یاد داشته باشید که مفسر پایتون محیط کدنویسی در این حالت را به مانند یک اسکریپت در نظر می‌گیرد.

ایجاد محیط مجازی

حالتی را در نظر بگیرید که در ایجاد پروژه‌های مختلف به نسخه‌های متفاوتی از برخی کتابخانه‌ها نیاز دارید؛ در این صورت چگونه می‌توانید چندین نسخه‌ متفاوت از یک کتابخانه‌ را در پایتون نصب نمایید؟ برای نمونه، فرض نمایید می‌خواهیم بر روی توسعه دو وب‌سایت؛ یکی توسط نسخه جدید (1.8) وب فریم‌ورک جنگو (Django) و دیگری بر روی یک نسخه قدیمی (0.96) از آن کار کنیم، ولی نمی‌توانیم!؛ زیرا که نمی‌شود هر دوی این نسخه‌ها را با هم در پایتون (دایرکتوری site-packages) نصب داشت. در این وضعیت راه حل ایجاد محیط‌هایی مجازی (Virtual Environments) برای توسعه پروژه‌های مورد نظر است؛ محیطی که توسعه و اجرای هر پروژه پایتون را به همراه تمام وابستگی‌های (Dependencies) آن از پروژه‌های دیگر جدا یا ایزوله (isolate) می‌کند. در ادامه به بررسی دو ابزار رایج در این رابطه می‌پردازیم.

virtualenv

در اینجا برای نصب virtualenv (ویرچوال اِنو) از pip استفاده می‌کنیم. [برای اطلاعات بیشتر به درس پیش مراجعه نمایید] - پیش از شروع هر نصبی بهتر است pip را آپدیت نماییم؛ این مراحل را در سیستم عامل گنو لینوکس به صورت پایین دنبال می‌کنیم:

user> sudo pip install -U pip

[...]
Successfully installed pip[...]

user>

نصب virtualenv:

user> sudo pip install virtualenv

[...]
Successfully installed virtualenv[...]

user>

توجه

چنانچه بر روی سیستم عاملی هر دو نسخه 2x یا 3x نصب است؛ این موضوع که virtualenv را توسط pip کدام نسخه نصب نمایید، اهمیت چندانی ندارد. چرا که امکان استفاده از آن برای دیگر نسخه‌ها نیز وجود دارد.

اکنون برای ایجاد یک محیط مجازی از دستور virtualenv ENV استفاده می‌شود که منظور از ENV در آن، نشانی دایرکتوری دلخواهی است که قصد داریم محیط مجازی در آن ایجاد گردد:

user> virtualenv Documents/SampleENV/

دستور بالا موجب ایجاد یک محیط مجازی در مسیر /Documents/SampleENV سیستم عامل، بر پایه مفسر پایتونی که از pip آن برای نصب virtualenv استفاده کردیم می‌شود و چنانچه بخواهیم محیط مجازی خود را بر پایه‌ نسخه‌ موجود دیگری از پایتون ایجاد نماییم، لازم است با استفاده از گزینه python-- نشانی مفسر آن مشخص گردد [صفحه راهنما]:

user> virtualenv --python=python2 ENV
user> virtualenv --python=python3 ENV
user> virtualenv --python=/opt/python3.3/bin/python ENV

در نمونه کد‌ بالا، نسخه‌های 2.7 و 3.4 پایتون از پیش بر روی سیستم عامل نصب بوده و نسخه 3.3 توسط کاربر در مسیر opt/python3.3/ نصب شده است.

مثالی دیگر برای کاربران ویندوز:

> virtualenv --python=C:\Python25\python.exe Documents\SampleENV\

اکنون می‌توانیم در پروژه خود به کتابخانه‌ها، pip، دایرکتوری site-packages و مفسری اختصاصی دسترسی داشته باشیم. البته پیش از شروع کار با یک محیط مجازی می‌بایست آن را activate (فعال) و پس از اتمام کار نیز آن را deactivate (غیر فعال) نماییم. فعال کردن در اینجا به معنای تنظیم متغیر Path سیستم عامل بر روی مفسر محیط مجازی مورد نظر است که با غیر فعال کردن، این وضعیت از بین می‌رود.

در گنولینوکس:

user> cd Documents/SampleENV/
user> source bin/activate
(SampleENV)$
(SampleENV)$ deactivate
user>

در ویندوز:

> cd Documents\SampleENV\
> Scripts\activate.bat
(SampleENV)>
(SampleENV)> deactivate.bat
>

pyvenv

در نسخه‌های 3x پایتون و از 3.3 به بعد ماژولی با نام venv برای ایجاد محیط مجازی به کتابخانه استاندارد پایتون افزوده شده است که می‌توان از آن به جای نصب virtualenv استفاده نمود؛ برای این منظور از دستور pyvenv (پای وی اِنو) و با الگویی مشابه pyvenv ENV استفاده می‌گردد.

در گنولینوکس:

user> pyvenv Documents/SampleENV/

user> cd Documents/SampleENV/
user> source bin/activate
(SampleENV)$
(SampleENV)$ deactivate
user>

در ویندوز:

> C:\Python34\python C:\Python34\Tools\Scripts\pyvenv.py Documents\SampleENV\

یا

> C:\Python34\python -m venv Documents\SampleENV\

[در درس بعد با ساختار نمونه کد بالا آشنا می‌شوید]

> cd Documents\SampleENV\
> Scripts\activate.bat
(SampleENV)>
(SampleENV)> deactivate.bat
>


😊 امیدوارم مفید بوده باشه

لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید.