درس ۰۴: برنامه‌نویسی تعاملی با پایتون

برنامه‌نویسی تعاملی با پایتون (interactive)

Photo by Anton Maksimov juvnsky

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

سطح: پایه



حالت تعاملی

از درس پیش به خاطر داریم که کدهای پایتون را می‌توان به دو روش اجرا نمود: ۱- ایجاد اسکریپت و معرفی آن به مفسر پایتون که در همان درس بررسی شد ۲- به شکل تعاملی با مفسر پایتون که موضوع همین درس است.

پایتون یک زبان برنامه‌نویسی با قابلیت «حالت تعاملی» (Interactive Mode) است؛ این قابلیت که مبتنی بر خط فرمان است، امکانی را برای پردازش و اجرای کدهای (دستورها، عبارت‌ها [1] و تعریف‌ها) زبان پایتون فراهم می‌آورد. کدنویسی در این حالت به مانند زمانی است که یک اسکریپت را ایجاد می‌نمایید؛ ولی با هر بار فشردن کلید Enter صفحه کلید، مفسر پایتون آن را به صورت خودکار اجرا می‌کند.

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

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

user> python
Python 3.4.2 (default, Jan 25 2015, 20:02:16)
[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

پس از ورود یک پیغام نمایش داده می‌شود؛ در این پیغام ضمن ارایه اطلاعات پایه در مورد مفسر پایتون و سیستم عامل، پیشنهاد می‌شود که جهت یافتن اطلاعات بیشتر در مورد زبان برنامه‌نویسی پایتون از دستورهای ویژه‌ایی استفاده نمایید:

  • ()license: باعث نمایش چندین صفحه مرتبط با تاریخ توسعه و پروانه‌های پایتون می‌گردد که البته از طریق - صفحه تاریخچه و پروانه پایتون - نیز قابل مشاهده است. برای مرور از کلید Enter و خروج از کلید q صفحه کلید استفاده نمایید.

  • credits: فهرستی از سازمان‌ها و شرکت‌های مشارکت کننده در توسعه زبان پایتون را نمایش می‌دهد.

  • copyright: فهرست کپی‌رایت زبان پایتون از ابتدا تا کنون را نمایش می‌دهد.

  • help: این دستور کاربرد زیادی دارد که در ادامه بررسی می‌شود. با استفاده از این دستور می‌توان در مورد اشیا و اجزای مختلف موجود در زبان پایتون راهنمایی گرفت.

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

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

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

>>> def func():
...     print("(50-5×6)÷4 =", (50-5*6)/4)
...
>>> func()
(50-5×6)÷4 = 5.0

ملاحظه

در پایتون برای تعریف یک تابع از کلمه کلیدی def استفاده می‌گردد که به دنبال آن نام و سپس پارامتر‌های تابع (در صورت نیاز) که درون پرانتز قرار می‌گیرند، آورده می‌شود. بعد از کاراکتر دو‌نقطه (Colon یا :) و در سطرهای بعدی با رعایت یکنواخت تورفتگی، دستورهای بدنه تابع نوشته می‌شوند. با فراخوانی تابع (وارد کردن نام تابع) بدنه تابع اجرا می‌گردد. چنانچه در تعریف تابع پارامترهایی نیز در نظر گرفته شده باشد، در هنگام فراخوانی می‌بایست مقدار متناظر آن‌ها نیز مشخص شود (درون پرانتز جلوی نام تابع) - در کد بالا تابع func فاقد پارامتر بوده بنابراین در هنگام فراخوانی آن مقداری ارسال نشده است. [فقط برای آگاهی اولیه - تابع‌ در پایتون توسط دروس دوازدهم تا چهاردهم بررسی خواهد شد]

توجه

برای پایان دادن به دستورهای چند سطری می‌بایست سطر پایانی را خالی رها کرده و کلید Enter را بفشارید.

برای پاک کردن صفحه از کلید‌های ترکیبی Ctrl–L استفاده نمایید. به منظور خروج نیز می‌توانید دستور ()quit را وارد کرده یا از کلیدهای ترکیبی Ctrl–D در گنولینوکس و Ctrl–Z با یک Enter پس از آن در ویندوز استفاده نمایید.

از مزایای حالت تعاملی این است که در بیشتر مواقع برای مشاهده نتیجه، نیازی به استفاده از print نمی‌باشد:

>>> a = 2
>>> a
2

>>> (50-5*6)/4
5.0

و چنانچه مشغول انجام محاسبات ریاضی هستید می‌توانید از یک متغیر خاص با نام _ (خط زیرین: Underscore) استفاده نمایید؛ این متغیر همواره به آخرین مقدار [2] محاسبه شده اشاره دارد:

>>> 5 * 6
30
>>> _
30
>>> 50 - _
20
>>> _ / 4
5.0

مثالی دیگر - در کاربرد ریاضی، برخی تابع‌ها توسط ماژول math از کتابخانه استاندارد پایتون در دسترس هستند [اسناد پایتون]:

>>> import math

>>> math.sqrt(36)
6.0

>>> math.pow(3, 2)
9.0

>>> math.radians(90)
1.5707963267948966

>>> math.sin(_)
1.0

اکنون می‌دانیم که برای وارد کردن یک ماژول به یک اسکریپت (یا ماژولی دیگر) از دستور import استفاده می‌گردد. پس از آن، برای دستیابی اجزای داخل آن مانند فراخوانی یک تابع نیز می‌بایست از الگوی «نام ماژول + نقطه + نام تابع مورد نظر» استفاده گردد.

و اگر از روش ... from ... import استفاده کنیم: در این صورت می‌توان به جای کل ماژول، تنها اجزای مورد نیاز خود را import نماییم و دیگر نیازی به ذکر نام ماژول نیز نخواهد بود:

>>> from math import sqrt, pow, radians, sin
>>> sqrt(36)
6.0
>>> pow(3, 2)
9.0
>>> radians(90)
1.5707963267948966
>>> sin(_)
1.0

مثالی دیگر - sys یکی از ماژول‌های مهم پایتون است؛ این ماژول امکان دسترسی به برخی از متغیرهای مورد استفاده توسط مفسر (در زمان اجرا) و همچنین تابع‌هایی که با مفسر در ارتباط هستند را فراهم می‌آورد [اسناد پایتون]:

>>> import sys

>>> sys.version
'3.4.2 (default, Jan 25 2015, 20:02:16) \n[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)]'

>>> sys.version_info
sys.version_info(major=3, minor=4, micro=2, releaselevel='final', serial=0)

>>> sys.platform
'linux'

>>> sys.getdefaultencoding()
'utf-8'

یا:

>>> from sys import version, version_info, platform, getdefaultencoding

>>> version
'3.4.2 (default, Jan 25 2015, 20:02:16) \n[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)]'

>>> version_info
sys.version_info(major=3, minor=4, micro=2, releaselevel='final', serial=0)

>>> platform
'linux'

>>> getdefaultencoding()
'utf-8'

دستور ()sys.exit نیز موجب توقف اجرا (در اینجا: خروج از حالت تعاملی پایتون) می‌گردد. برای کنترل خطاها کاربرد دارد و همچنین می‌توان پیامی مرتبط را به خروجی فرستاد (معمولا گزارش رویدادی که موجب اتمام ناگهانی برنامه شده‌ است):

>>> import sys

>>> sys.exit("Error: Goodbye! :| ")
Error: Goodbye! :|

user>

یا

>>> from sys import exit as bye

>>> bye("Error: Goodbye! :| ")
Error: Goodbye! :|

user>

با استفاده از as می‌توان برای اجزای import شده (به هر دو روش)، یک نام دلخواه تنظیم کرد. این ویژگی در زمانی که نام اصلی طولانی بوده یا با یکی از اجزای داخل ماژول همنام باشد (برای جلوگیری از تداخل) کاربرد دارد.

دریافت راهنمایی

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

>>> help
Type help() for interactive help, or help(object) for help about object.

به دو روش می‌توان از امکان راهنمایی استفاده کرد که در ادامه بررسی می‌شود.

توجه

در هر دو روش برای مرور توضیحات طولانی از کلیدهای Enter (سطر به سطر) و Space (صفحه به صفحه) بهره بگیرید و برای خروج از توضیحات نیز از کلید q صفحه کلید استفاده نمایید؛ همواره انتهای توضیحات توسط عبارت (END) مشخص شده است.

روش یکم: رفتن به حالت راهنمای تعاملی

برای این منظور از دستور ()help استفاده می‌گردد - با وارد کردن این دستور ضمن نمایش پیغام خوش‌آمد گویی، نماد سطر (<<<) نیز به <help تغییر پیدا می‌کند:

>>> help()

Welcome to Python 3.4's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help>

اکنون کافی است نام موردی که می‌خواهید درباره آن اطلاعات بگیرید را وارد نمایید؛ در همین راستا همانطور که در پیغام ابتدایی هم بیان شده است می‌توانید از فرمان‌‌های پایین نیز کمک بگیرید:

  • modules: نمایش فهرستی از نام تمامی ماژول‌های در دسترس

  • keywords:‌ نمایش تمام کلمه‌های کلیدی پایتون

  • symbols:‌ نمایش تمام نماد‌های معنادار در پایتون

  • topics: نمایش فهرستی از مباحث مربوط به پایتون

help> keywords

Here is a list of the Python keywords.  Enter any keyword to get more help.

False               def                 if                  raise
None                del                 import              return
True                elif                in                  try
and                 else                is                  while
as                  except              lambda              with
assert              finally             nonlocal            yield
break               for                 not
class               from                or
continue            global              pass

help> def

Function definitions
********************

A function definition defines a user-defined function object (see
section *The standard type hierarchy*):

[...]

A function definition is an executable statement.  Its execution binds
the function name in the current local namespace to a function object
(a wrapper around the executable code for the function).  This
function object contains a reference to the current global namespace
:

برای خروج از راهنمای تعاملی، quit (یا q) را وارد نماید.

روش دوم: فراخوانی تابع راهنما

در این روش از الگوی (help(object برای دریافت اطلاعات درباره یک شی (object)، به صورت مستقیم و بدون ورود به راهنمای تعاملی استفاده می‌شود - تنها کافی است نام شی مورد نظر را درون پرانتز قرار دهید (به جای واژه object):

>>> help(print)

Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
(END)

>>>

از این روش با الگوی دیگری هم استفاده می‌شود. الگوی ("help("string یعنی قرار دادن نام موردی که می‌خواهید درباره آن اطلاعات بگیرید درون پرانتز به شکلی محصور با دو نماد نقل قول ( " " ) - این الگو عملکردی مشابه با روش قبل (روش یکم) دارد با این تفاوت که دریافت اطلاعات به صورت مستقیم و بدون ورود به راهنمای تعاملی انجام می‌پذیرد. در واقع برای به دست آوردن اطلاعات درباره موردی که شی نمی‌باشد (مانند هر یک از دستورهای symbols ،keywords ،modules و topics یا...) لازم است به این صورت اقدام گردد.

گزینه‌های فراخوانی

در کنار دستور فراخوانی پایتون در خط فرمان، می‌توان از گزینه‌ها و دستورهای گوناگونی بهره برد. البته قبلا هم از آن‌ها استفاده کردیم؛ مانند زمانی که قصد داشتیم نسخه پایتون مورد نظر خود را بیابیم یا حتی زمانی که قصد داشیم یک اسکریپت را اجرا کنیم. واقعیت این است که دستور فراخوانی پایتون الگویی دارد که شکل کامل آن در پایین آورده شده است. [اسناد پایتون]:

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

همانطور که مشاهده می‌شود این دستور می‌تواند سه دسته آرگومان را بپذیرد:

دسته یکم (Options):

شامل برخی از حروف الفباست که به همراه یک کاراکتر خطِ فاصله (Dash) - بعد از دستور اصلی یعنی python می‌آیند؛ برخی از این گزینه‌ها به شرح زیر است:

  • q− در هنگام ورود به حالت تعاملی پایتون از نمایش پیغام ابتدایی صرف نظر می‌شود:

    user> python -q
    >>> 2 + 2
    4
    
    • Qold: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد. (پیکربندی چگونگی محاسبات ریاضی)

    • Qnew: حاصل تقسیم دو عدد صحیح یک عدد ممیز شناور باشد. (پیکربندی چگونگی محاسبات ریاضی)

    • Qwarn: حاصل تقسیم دو عدد صحیح یک عدد صحیح باشد، به همراه نمایش پیام هشدار به ازای هر عملگر. (پیکربندی چگونگی محاسبات ریاضی)

    • Qwarnall: به مانند Qwarn است ولی به ازای تمام عملگرهای تقسیم به کار رفته در اسکریپت تنها یک پیام هشدار نمایش داده می‌شود.

    python -Qnew script.py
    
  • O- یا OO- - راه‌اندازی بهینه‌ساز (Optimization) پایه بایت‌کد، که می‌تواند تا حدودی موجب بهبود کارایی اسکریپت گردد. استفاده از گزینه OO- علاوه بر بهینه سازی، موجب دور انداختن مستندات [3] (Docstrings) موجود در اسکریپت نیز می‌شود:

    python -O script.py
    

    نکته

    در صورت استفاده از این گزینه‌ها، به جای فایل pyc. (بایت‌کد معمولی)، فایلی با پسوند pyo. (بایت‌کد بهینه شده) ایجاد می‌گردد.

  • B- مفسر پایتون از ذخیره بایت‌کد ماژول‌های import شده بر روی دیسک خودداری می‌کند:

    python -B script.py
    
  • d- برخی از گزارش‌های اضافه خطایابی (در صورت وجود) نمایش داده می‌شوند:

    python -d script.py
    
  • i- پس از اجرای اسکریپت، خط فرمان به حالت تعاملی پایتون وارد می‌شود:

    python -i script.py
    
  • V- (برابر با version--) - نسخه پایتون نمایش داده می‌شود:

    python -V
    
  • ?- یا h- (برابر با help--) - فهرست گزینه‌های فراخوانی پایتون به همراه توضیحاتی کوتاه نمایش داده می‌شود:

    python -h
    
  • S- از import شدن ماژول site جلوگیری می‌شود:

    python -S
    

    به صورت عادی ماژول site در زمان راه‌اندازی مفسر پایتون به صورت خودکار import می‌گردد و وظیفه آن گسترش sys.path است. به عنوان نمونه؛ این ماژول مسیر دایرکتوری site-packages را به sys.path اضافه می‌کند.

    دایرکتوری site-packages محل نگهداری بسته‌ها یا کتابخانه‌های شخص ثالثی است که با استفاده از pip اقدام به نصب آن‌ها در پایتون کرده‌ایم.

    هر زمان که ماژولی import می‌شود مفسر پایتون در داخل دایرکتوری‌های مشخصی به دنبال آن می‌گردد؛ این دایرکتوری‌ها در sys.path فهرست شده‌اند.

    برای نمونه در ویندوز:

    > python -q
    
    >>> import sys
    >>> sys.path
    ['', 'C:\\Python34', 'C:\\Windows\\SYSTEM32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34\\lib\\site-packages']
    >>>
    

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

    user> python -qS
    
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4/', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload']
    >>>
    

    از گزینه S استفاده شده است و همانطور که مشاهده می‌نمایید دیگر از دایرکتوری site-packages خبری نیست!

    نکته

    نخستین دایرکتوری که مفسر در آن به دنبال نام ماژول می‌گردد؛ دایرکتوری حاوی اسکریپت است که در کدهای بالا (چون که مربوط به حالت تعاملی پایتون است) توسط '' مشخص شده است.

    مفسر دایرکتوری‌های این فهرست را به ترتیب (از چپ به راست) برای جستجو در نظر می‌گیرد.

    می‌توانید با نوشتن مسیر دایرکتوری‌های دلخواه خود درون یک فایل متنی با پسوند pth. و قرار دادن آن درون دایرکتوری site-packages، این دایرکتوری‌ها را نیز به sys.path بیافزایید. برای نمونه فایل mypath.pth را (در سیستم عامل گنولینوکس) ایجاد می‌نماییم:

    user> cd /usr/local/lib/python3.4/site-packages
    user> sudo touch mypath.pth
    user> sudo chmod 777 mypath.pth
    

    فایل mypath.pth را با یک ویرایشگر متن باز کرده و مشابه پایین فهرست دایرکتوری‌های مورد نظر خود را در آن وارد می‌نماییم:

    /home/user/Documents
    /home/user/Documents/me
    

    اکنون تمام ماژول‌های موجود در این دایرکتوری‌ها قابل import هستند؛ به فهرست sys.path توجه نمایید:

    user> python -q
    
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages', '/home/user/Documents', '/home/user/Documents/me']
    >>>
    

    همین کار را می‌توان از طریق برنامه‌نویسی نیز انجام داد، البته پس از اتمام اجرای اسکریپت (در اینجا: خروج از حالت تعاملی) اثر آن از بین می‌رود:

    user> python -q
    
    >>> import sys
    >>> sys.path.append('/home/user/Documents')
    >>> sys.path.append('/home/user/Documents/me')
    

    تابع append دایرکتوری مورد نظر را به انتهای فهرست sys.path اضافه می‌کند. البته می‌توان با استفاده از تابع insert به جای append جایگاه دایرکتوری دلخواه خود را با استفاده از آرگومان نخست آن در sys.path مشخص نمود؛ با این کار دایرکتوری مورد نظر زودتر از دایرکتوری‌های بعد خودش توسط مفسر مورد جستجو قرار می‌گیرد - فایده این کار زمانی مشخص می‌شود که در دایرکتوری‌هایی مجزا، ماژولی با نام یکسان وجود داشته باشد؛ در این صورت ماژولی که زودتر توسط مفسر دیده شود به عنوان ماژول مورد نظر import می‌شود:

    user> python -q
    
    >>> import sys
    >>> sys.path.insert(1,'/home/user/Documents/me')
    >>> sys.path
    ['', '/home/user/Documents/me', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages']
    >>>
    

    چند درس جلوتر خواهید آموخت که مقدار sys.path در واقع یک شی از نوع list است؛ append و insert نیز تابع‌هایی هستند که توسط یک شی از نوع list ارایه می‌گردد. در این مرحله تنها به یاد داشته باشید که موقعیت‌ها در یک شی از نوع list از عدد صفر شماره‌گذاری می‌گردند.

دسته دوم:

  • c command- این الگو امکان اجرای دستورهای پایتون را بدون ورود به حالت تعاملی یا ایجاد اسکریپت، فراهم می‌سازد:

    user> python -c "import sys; print(sys.path)"
    ['', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages']
    

    توجه

    دستورها باید درون نمادهای نقل قول محصور باشند.

    استفاده از سمی‌کالن ( ; )‌ در پایان دستورهای پایتون اجباری نیست ولی چنانچه بخواهیم چند دستور را در یک سطر قرار بدهیم می‌بایست از آن استفاده نماییم.

  • m module-name- این الگو امکان اجرای یک ماژول (از میان فهرست sys.path) را به عنوان ماژول '__main__' فراهم می‌سازد.

    جالب‌ترین نمونه برای بیان کاربرد این الگو، اجرای ماژول http.server است. زمانی که نیاز به راه‌اندازی سریع یک وب سرور دارید و نمی‌خواهید خود را درگیر نصب و پیکربندی Nginx یا دیگر وب سرور‌ها نمایید؛ می‌توانید از این ماژول پایتون بهره بگیرید. این ماژول امکانات یک وب سرور ساده را در اختیار شما قرار می‌دهد. [اسناد پایتون]:

    user> python -m http.server 8080
    

    توجه

    در استفاده از این الگو نیز همانند زمان import، پسوند ماژول (py) نوشته نمی‌شود.

    می‌توان شماره پورت را وارد نکرد که در این حالت به صورت پیش‌فرض پورت 8000 در نظر گرفته می‌شود.

    ولی منظور از ماژول '__main__' چیست؟

    هنگامی که ماژولی (برای نخستین بار) import می‌شود، مفسر پایتون به صورت خودکار تمام کد‌های درون آن را اجرا می‌کند. در مواردی ممکن است یک فایل py. حاوی کدهایی باشد که تنها می‌بایست در حالت اسکریپت به اجرا درآید؛ در این شرایط با import شدن فایل، این کد‌ها نیز اجرا می‌گردند که خواست برنامه‌نویس نمی‌باشد!. از طرفی در پایتون یک سری مقادیر و متغیرهای ویژه و از پیش تعریف شده به مانند __name__ وجود دارد. متغیر __name__ به نام ماژول اشاره دارد؛ در حالت اسکریپت (اجرای یک ماژول به صورت مستقیم - نمونه دستور: python script.py - درس پیش توضیح داده شد) مقدار __name__ برابر با یک مقدار ویژه به نام '__main__' می‌گردد که از این موضوع می‌توان برای کنترل اجرای کدها استفاده کرد.

    معمولا کدهای اسکریپت به گونه‌ای نوشته می‌شوند که اجرای آن‌ها وابسته به اجرای یک تابع اصلی باشد که معمولا ()main نامیده می‌شود که در انتها بتوان با قرار دادن شرط برابری مقدار __name__ با '__main__' برای اجرای تابع یاد شده، از اجرای کد‌های مورد نظر تنها در حالت اجرا به صورت اسکریپت (و نه در زمان import) مطمئن شد.

    def main():
        print("this runs only when executed directly")
    
    if __name__ == '__main__':
        main()
    
  • script این الگو (python script.py) بیان‌‌گر همان روش اجرای اسکریپت است که در درس پیش به صورت کامل بررسی شد.

دسته سوم (Arguments):

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

import sys

def main():
    print(sys.argv)
    print(sys.argv[0])
    print(sys.argv[1])
    print(sys.argv[2])

if __name__ == '__main__':
    main()

نکته

از آنجا که عملکرد و خروجی مورد نظر این ماژول تنها در حالت اجرای اسکریپت است (دریافت آرگومان‌ها) و نه import آن در برنامه، بنابراین با بررسی نام ماژول در زمان اجرا از این موضوع اطمینان حاصل کردیم.

اسکریپت بالا را با ارسال دو آرگومان arg_1 و arg_2 اجرا می‌نماییم:

user> cd /home/user/Documents

user> python script.py arg_1 arg_2
['/home/user/Documents/script-argv.py', 'arg_1', 'arg_2']
/home/user/Documents/script-argv.py
arg_1
arg_2

مقدار sys.argv نیز یک شی از نوع list است: [... ,Ο, Ο, Ο] - برای دسترسی به عناصر موجود در شی list، از الگویی مشابه [object[index که در آن ...,index=0,1,2,3 است، استفاده می‌گردد؛ به عنوان نمونه [sys.argv[0 به نخستین عنصر موجود در sys.argv اشاره دارد.

عضو نخست sys.argv یا [sys.argv[0 همواره حاوی نام اسکریپت است. البته به جز در مواقعی که از c- استفاده کرده‌ایم که در این صورت برابر مقدار 'c-' خواهد بود:

user> python -c "import sys; print(sys.argv)" 2
['-c', '2']

تمرین

یک اسکریپت ایجاد نمایید که دو پارامتر نام و سن را به صورت آرگومان‌های اسکریپت دریافت و بر روی خروجی نمایش دهد.

نمونه دستور اجرای اسکریپت:

python script.py "Hideyoshi Nagachika" 19

نمونه خروجی اسکریپت:

Name: Hideyoshi Nagachika - Age: 19