نحوهی اجرای دستورات لینوکس در برنامههای پایتون
در سیستم عامل لینوکس دستورات زیادی وجود دارد که میتوان آنها را در خط فرمان اجرا نمود و از آنها برای انجام کارهای مختلف استفاده کرد. از آن جا که این دستورات بسیار متنوع و کاربردی هستند، بسیاری از برنامه نویسان علاقه دارند تا از آنها در برنامهی پایتون خود نیز استفاده کنند. قابلیت استفاده از دستورات لینوکس در برنامههای پایتون باعث میشود تا توسعه دهندگان بتوانند به سادگی برنامههایی کاربردی در محیط لینوکس توسعه دهند. در این مقاله با چگونگی استفاده از این دستورات در یک برنامهی پایتون آشنا میشویم.
برای مثال با استفاده از دستور ls در خط فرمان لینوکس میتوان فایلهای موجود در مسیر جاری (current directory) را مشاهده نمود. در صورتی که دستور ls را در یک اسکریپت پایتون بنویسید، خطایی به صورت زیر به شما نمایش داده میشود:
Traceback (most recent call last): File "test.py", line 1, in <module> ls NameError: name 'ls' is not defined
خطای بالا نشان میدهد که مفسر پایتون ls را به عنوان یک دستور نمیشناسد و به صورت یک متغیر از پیش تعریف نشده با آن رفتار میکند. در ادامه با ماژولهایی در پایتون آشنا میشویم که با استفاده از آنها میتوان از دستورات لینوکس در برنامهی خود استفاده نماییم.
ماژول os
یکی از روشهای بکارگیری دستورات لینوکس در یک برنامه پایتون، استفاده از متد system در کتابخانهی os است. این متد با فراخوانی تابع استاندارد system در C، دستور مورد نظر را در یک پوستهی فرعی (subshell) اجرا میکند. بنابراین با استفاده از این ماژول میتوان دستور ls را به صورت زیر اجرا نمود:
import os os.system('ls')
بدین ترتیب با اجرای این دستورات، فایلهای موجود در همان مسیری که برنامهی ما قرار دارد نمایش داده میشود. از تمام دستورات میتوان به این صورت در برنامهی خود استفاده کرد. برای مثال با استفاده از برنامهی زیر میتوان تقویم سال جاری میلادی را مشاهده نمود:
import os os.system('cal -y')
خروجی این برنامه به صورت زیر است:
ماژول subprocess
استفاده از متد os.system به مرور زمان در حال منسوخ شدن است و استفاده از آن پیشنهاد نمیشود. روش جایگزین آن، فراخوانی تابع call موجود در کتابخانهی subprocess است. نحوهی اجرای دستور ls با استفاده از این ماژول به صورت زیر است:
from subprocess import call call('ls')
ماژول subprocess دارای قابلیتهای بیشتری برای اجرای دستورات و نمایش خروجی آنها است. این کتابخانه دارای توابع دیگری برای اجرای دستورات لینوکس نیز میباشد. برای مثال میتوان در برنامهی خود از دستور date به صورت زیر استفاده کرد:
import subprocess time = subprocess.Popen('date', stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = time.communicate() print ('It is ', str(output.decode("utf-8")))
روش دیگر برای استفاده از ماژول subprocess، فراخوانی تابع check_output است. برنامهی بالا را با استفاده از این روش به صورت زیر نوشته میشود:
import subprocess time = subprocess.check_output('date') print ('It is', str(time.decode("utf-8")))
خروجی این دو برنامه یکسان بوده و به صورت زیر است:
It is Thu Jul 27 02:34:44 +0430 2017
در بسیاری از موارد، استفاده از روش اول پیشنهاد میشود. چرا که میتوان از خروجی دستور و همچنین خطای حاصل از اجرای دستور (در صورت عدم اجرای صحیح آن و بازگشت خطا) استفاده کرده و آنها را برای عملیاتهای دیگر در برنامه بکار گرفت. توجه داشته باشید در صورتی که قصد دارید از یک دستور به همراه پارامترهای اضافه استفاده کنید، باید تمام آنها را در قالب یک لیست به تابع Popen ارسال نمایید. برای مثال به منظور نمایش تقویم میلادی سال جاری – که با پارامتر y به همراه دستور cal میآید – باید برنامه مورد نظر را به صورت زیر نوشت:
import subprocess calendar = subprocess.Popen(['cal', '-y'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = calendar.communicate() print ('Calendar:\n', str(output.decode("utf-8")))
مثالهای بالا نشان دهندهی قابلیت انعطاف پذیری بسیار خوب توابع موجود در ماژول subprocess است. همان طور که مشاهده نمودید، ماژول subprocess دارای قابلیتهای بیشتر و کارایی بهتری نسبت به ماژولِ قدیمی os است. این موارد تنها نمونههای سادهای از نحوهی اجرای دستورات لینوکس در برنامههای پایتون بوده است. برای کسب اطلاعات بیشتر در مورد ماژول subprocess میتوانید به مستندات آن مراجعه کنید. شما با استفاده از قابلیتهای متنوع این کتابخانه میتوانید برنامههایی بسیار کاربردی در محیط لینوکس توسعه دهید.
مطالب زیر را حتما مطالعه کنید
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آشنایی با رشته در پایتون
برنامه نویسی چند نخی در پایتون
تولید اعداد Random با Python
4 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام اقای بابا پور خیلی ممنون بابت گذاشتنً این صفحه
من میخوام یه دستور رو تَو پایتون استفاده کنم منتها این دستور دو مرحله داره یعنی ابتدا یه دستور وارد میکنی وارد قسمت اصلی میشی بعد اونجا دستور بعدی رو وارد میکنی که دو تا پارامتر داره بعد از اینتر عمل مورد نظر انجام میشه، میتونید راهنمایی کنید لطفا
سلام دوست عزیز.
سوالتون واضح و دقیق نیست. اگه درست متوجه شده باشم، شاید بتونید از دستور with در کنار Popen استفاده کنید. به این بخش از مستندات مراجعه کنید، امیدوارم بتونه به شما کمک کنه.
سلام اقای باباپور .
من میخوام از طریق یک نرم افزار به نام linphone روی یک سیستم لینوکس یه تماس با یک تلفن ای پی برقرار کنم حالا در لینوکس بایستی ابتدا یک دستور وارد کنم که وارد قسمت نرم افزار linphone بشم بعد اونجا میتونم دستوراتمو اجرا کنم مثل تماس گرفتن . ابتدا دستور linphonec رو میزنم میره داخل محیط دیگه ای به این شکل call 9126773
به این شکله یعنی دو مرحله دستور دارم
سلامی دوباره..
نرم افزار linphone خودش یک پکیج برای پایتون با همین نام داره که میتونید با pip اون رو نصب کنید. (متاسفانه بنده تجربهی کار با پکیج linphone رو ندارم).
اما به طور کلی اگر خواستید از subprocess استفاده کنید، میتونید با استفاده از متد call این کار رو انجام بدید تا دستور linphonec اجرا بشه، سپس وارد محیطش میشید و در اون قسمت دستورات call یا answer یا … رو وارد کنید. پس از پایان کار وقتی از برنامه خارج بشید، ادامهی اسکریپت پایتونی که نوشتید اجرا میشه.
موفق باشید.