مبانی اسکریپت‌نویسی در پایتون - قسمت اوّل

ورود به دنیای اسکریپت‌نویسی در پایتون
ورود به دنیای اسکریپت‌نویسی در پایتون


عنوان انگلیسی: How to Write Python Scripts? - Basics - Part 1

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

https://stackoverflow.com/a/46386479/13516000
بخش اول:
اساساً تمام زبان‌های اسکریپت‌نویسی، زبان‌های برنامه‌نویسی هستند. تفاوت نظری میان این دو مفهوم در این است که زبان‌های اسکریپت‌نویسی نیازی به مرحله‌ی کامپایل (ترجمه‌ی یک‌جای کد نوشته شده به زبانی سطح پایین مانند زبان ماشین را گویند. این فرایند توسط کامپایلر انجام می‌شود.) ندارند و عموماً تفسیر می‌شوند. برای نمونه یک برنامه‌ی نوشته شده به زبان C نیازمند کامپایل شدن قبل از اجراست، در حالی که زبان‌‌های اسکریپت‌نویسی نظیر JavaScript یا PHP نیازی به ترجمه‌شدن توسط کامپایلر ندارند. (این زبان‌ها عموماً تفسیر/Interpret می‌شوند؛ به این معنا که مفسر/Interpreter خطوط کد را خط به خط اجرا می‌کند و نتیجه را در صورت نیاز نمایش می‌دهد. می‌توان گفت در زبان‌های مفسری، کد یک REPL/Read-Eval-Print Loop یا حلقه‌ی بخوان-ارزیابی کن-چاپ کن تعاملی دارد.)

کاربردهای زبان‌های اسکریپت‌نویسی:
۱- انجام کارهای خاص در یک برنامه به‌صورت اتوماتیک (اتوماسیون)
۲- استخراج اطلاعات از یک مجموعه‌داده
۳- فشردگی کد کمتر در مقایسه با زبان‌های برنامه‌نویسی سنتی (منظور از Less Code-intensive در اینجا وجود کدهای منبع بسیار کوتاه است. این زبان‌ها معمولاً نحو/Syntax و معناشناسی/Semantics راحتی دارند و از این رو بسیار سریع یاد گرفته و نوشته می‌شوند.)

کابرد‌های زبان‌های برنامه‌نویسی:
۱- همانند اسکریپت‌ها، معمولاً داخل یک برنامه‌ی والد اجرا می‌شوند.
۲- سازگاری بیشتری برای یک‌پارچه‌سازی کد و مدل‌های ریاضی دارند.
۳- زبان‌هایی نظیر JAVA قادر به ترجمه بر روی هر پلتفرمی هستند. (البته این مورد را نمی‌توان یک مزیت و کاربرد دانست، زیرا زبانی نظیر Python را نیز زبانی فارغ از پلتفرم یا Cross-Platform می‌دانند.)

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

بخش سوم:
به‌صرف این‌که چیزی تفسیر می‌شود، نمی‌توان آن را یک زبان اسکریپت‌نویسی دانست؛ گذشته از این‌ها، پایتون می‌تواند کامپایل شود؛ یعنی پایتون استاندارد -همانند جاوا- کد پایتون را به بایت‌کدها تبدیل و بعد تفسیر می‌کند. اما هرگز نمی‌توان JAVA را Scripting Language دانست. همچنین مفسرهایی برای C وجود دارند. [با این تفاسیر] هر زبانی را می‌توان هم تبدیل (کامپایل) و هم تفسیر کرد. (این قسمت از متن پاسخ برای نویسنده نیز بسیار گیج‌کننده بود!)

بخش پایانی (نتیجه‌گیری):
پایتون به‌دلیل وجود یک ابهام تاریخی میان زبان‌های برنامه‌نویسی چند‌منظوره و زبان‌های اسکریپت‌نویسی، یک زبان اسکریپت‌نویسی محسوب می‌شود. در حقیقت پایتون یک زبان اسکریپت‌نویسی نیست، اما یک زبان برنامه‌نویسی چندمنظوره است که می‌تواند به خوبی کارهای یک زبان اسکریپت‌نویسی را انجام دهد.


به‌طور کلی Python (تلفظ صحیح: ˈpīTHən یا پایثن) را می‌توان ابزاری همه‌کاره دانست که در سال‌های اخیر محبوبیت زیادی میان برنامه‌نویسان و توسعه‌دهندگان پیدا کرده است و اعطای لقب «چاقوی سوئیسی» به این ابزار دوست‌داشتنی توسط متخصصان این حیطه، چندان بی‌راه نیست و برازنده‌ی پایتون می‌باشد.

پایتون در حوزه‌های مختلفی کاربرد‌های گسترده و وسیعی دارد و این گستردگی را مرهون وجود کتابخانه‌های بی‌شماری است که برای این زبان برنامه‌نویسی موجود هستند، اما برای ذکر توانایی‌های شاخص پایتون -همان‌طور که در مقاله‌ی آشنایی با ۳ حوزه اصلی کاربرد زبان پایتون ذکر شده است- می‌توان توانایی‌های پایتون را در سه حوزه‌ی زیر خلاصه کرد:

  • توسعه نرم‌افزارهای تحت وب (Web Development)
  • علم داده (Data Science) شامل: یادگیری ماشین (Machine Learning)، آنالیز داده‌ها (Data Analysis) و بصری‌سازی داده‌ها (Data Visualization)
  • اسکریپت نویسی (Scripting)


قبل از ورود به اسکریپت‌نویسی باید دانست که در کنار پایتون زبان‌هایی نظیر PHP نیز می‌توانند ابزار‌های مناسبی برای این منظور باشند. از طرفی، می‌توان با کمک Bash [و نظایر آن] که در واقع پوسته/shell سیستم‌عامل‌های شبه‌یونیکس/Unix-Like محسوب می‌شود، این کار را انجام داد که کلماتی مانند Shell Scripting و Bash Scripting برای همین منظور استفاده می‌شوند.


در این مجموعه قصد بر این است که مبانی اجرای یک اسکریپت نوشته شده با پایتون در رابط کاربری کامندلاین یا Command Line Interface (به اختصار CLI) بررسی شود.

به‌طور کلی اوّلین مرحله در ساخت یک اسکریپت قابل اجرا در محیط کامندلاین، مدیریت آرگومان‌های ورودی کاربر است. همانند اسکریپتی نظیر cd (اسکریپت Change Directory که با نام chdir نیز شناخته می‌شود) که در Unix Shell یا Windows Command Prompt وظیفه‌ی تغییر دایرکتوری جاری را بر عهده دارد، عموماً شِما و نحو یک اسکریپت به صورت زیر است:

$ Script_name [-options] [arguments]

برای آشنایی با هر اسکریپت و نحوه‌ی استفاده از آن می‌توان به مستندات/Documentations مربوط به استفاده از آن مراجعه کرد.

ممکن است خط فرمان ورودی دارای options یا arguments (یا هر‌دوی آن‌ها) نباشد. مثال‌های زیر برای فهم بیشتر این مسأله آورده شده‌اند.

$ cd ~

(No arguments!) Changes the current directory to the home directory.

$ cd games

(No options!) If there is a subdirectory called 'games' in the current directory, changes the current directory to games.

$ cd ..

Will move the current directory up one directory (To the parent directory).

$ ls

(Neither options nor arguments are used!) Represents a list of directories and files in the current directory.

$ ls -a

Represents a list of all files directories in the current directory, including hidden files (files or folder started with a dot in their names like .games)


نمونه‌ای از یک راهنمای استفاده مربوط به کامند mkdir [به‌صورت اجمالی] در زیر آمده است:

Name:
mkdir - make directories

Synopsis:
mkdir [OPTION]... DIRECTORY...

Description:
Create the directory(ies), if they do not already exist.
Mandatory arguments to long options are mandatory for short options too.

-m, --mode=MODE
set file mode (as in chmod), not a=rwx - umask
-p, --parents
no error if existing, make parent directories as needed
-v, --verbose
print a message for each created directory
-Z, --context=CTX
set the SELinux security context of each created directory to CTX
--help
display this help and exit
--version
output version information and exit

Author:
Written by David MacKenzie.

تمامی اسکریپت‌ها عموماً دارای گزینه‌ای شبیه به help-- می‌باشند که راهنمای استفاده از آن اسکریپت را در اختیار قرار می‌دهد. همچنین کامند man در لینوکس که مخفّف کلمه‌ی manual می‌باشد، دارای رفتاری مشابه help است.

$ man mkdir
$ mkdir --help


نکته‌ی اساسی در اسکریپت‌نویسی با پایتون شناخت ویژگی sys.argv از ماژول sys -که یک ماژول Built-in در پایتون محسوب می‌شود- است. این ویژگی/Attribute در واقع لیستی از آرگومان‌های ورودی است که از کامندلاین گذر کرده و به اسکریپت وارد می‌شوند. قطعه‌کد زیر در فایل script.py ذخیره شده است.

#!/usr/bin/python3

import sys
arguments = sys.argv
print(arguments)

همچنین درخت دایرکتوری فرضی‌ای که اسکریپت در آن قرار دارد نیز در ادامه آورده شده است.

Desktop
├── Test_Directory
│    ├── script.py
│    └── help.txt
└── Another_Directory

به کمک دستور cd می‌توان دایرکتوری جاری را به Test_Directory تغییر داد. دو نحوه‌ی اجرای این اسکریپت پایتون در محیط شل، در زیر آورده شده است.

$ python3 <script_name>.py arg1 arg2 arg3
$ python3 -m <module_name> arg1 arg2 arg3

باید توجه داشت که وجود گزینه‌ی m- در دستور دوم موجب بروز تفاوت‌هایی در نحوه‌ی برخورد پایتون با اسکریپت خواهد شد. (برای کسب اطلاعات بیشتر می‌توان مطالبی که پیرامون تفاوت‌های ماژول‌ها و اسکریپت‌ها است را مطالعه نمود. در قسمت‌های بعدی از این سری، اطلاعات و توضیحات بیشتری در این‌باره ارائه خواهد شد.)

واضح‌ترین تفاوت میان این دو نوشتار عدم وجود پسوند/extension مرسوم فایل‌های پایتون (py.)، پس از نام فایل در حالت دوم می‌باشد. همچنین، در صورت استفاده از m- در خط فرمان، پایتون در sys.path به‌دنبال <module_name> خواهد گشت و در صورت وجود، محتویات داخل آن را به عنوان ماژول __main__ اجرا خواهد کرد. المان اول لیست sys.argv نیز مسیر کامل [و مطلق] دسترسی به اسکریپت ما خواهد بود.

نتیجه‌ی اجرای خطوط مذکور در شل
نتیجه‌ی اجرای خطوط مذکور در شل


مثال‌های زیر به عنوان نمونه‌هایی ساده از اسکریپت‌ها و خلاصه‌ای از آن‌چه تاکنون بیان شده است می‌باشند.

  • Script.py:
#!/usr/bin/python3

import sys

print('Number of arguments:',  len(sys.argv) - 1,  'arguments.')
print('Argument List:',  sys.argv[1:])
  • Shell:
$ python3 script.py Mahdi 25
Number of arguments: 2 arguments.
Argument List: ['Mahdi', '25']


  • hello.py:
#!/usr/bin/python3
import sys

args = sys.argv[1:]
name = args[0]
age = int(args[1])
prompt = &quotHello {}, you are now {}&quot + (&quot years old!&quot, &quot year old!&quot)[age == 1]
print(prompt.format(name, age))
  • Shell:
$ python3 hello.py Mahdi 25
Hello Mahdi, you are now 25 years old!
$ python3 hello.py Mahdi 1
Hello Mahdi, you are now 1 year old!


  • reverse.py:
#!/usr/bin/python3

import sys

string = sys.argv[1]
print(string[::-1])
  • Shell:
$ python3 reverse.py &quotMahdi Mohammadi&quot
idammahoM idhaM
$ python3 reverse.py Mahdi\ Mohammadi
idammahoM idhaM

نکته: کاراکتر بک‌اسلش \ باعث نادیده گرفته شدن فاصله (whitespace) خواهد شد.



در قسمت بعدی از این سری نحوه‌ی پیاده‌سازی یک اسکریپت دارای ویژگی help-- بررسی خواهد شد. این اسکریپت وظیفه‌ای نظیر کامند ls را برعهده خواهد داشت و کاربرد اصلی آن یعنی «نمایش لیستی از فایل‌ها و دایرکتوری‌های آشکار موجود» را شبیه‌سازی خواهد کرد. همچنین روش‌های دیگری برای مدیریت آرگومان‌ها و تنظیمات ورودی کاربر بیان خواهد شد که بررسی آرگومان‌ها را ساده‌تر و قابل فهم‌تر خواهد کرد.


سخن آخر:

نوشتار رسمی کافیست! :)

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