آموزش رزبری پای

اجرای دستورات لینوکس با پایتون در رزبری پای

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

در این آموزش، نحوه اجرای دستورات Shell لینوکس با پایتون را با استفاده از ماژول‌های os و subprocess در برد رزبری پای خواهیم دید.

استفاده از ماژول سیستم عامل OS

ماژول os یک روش ساده را برای استفاده از عملکرد های وابسته به سیستم عامل ارائه می دهد. با کدهای کوتاه پایتون، می توانید وظایف استاندارد سیستم عامل را بدون نیاز به تعامل با دسکتاپ انجام دهید. روش os به شما امکان می دهد این کار را به ساده ترین شکل انجام دهید. برای استفاده از ماژول os برای اجرای دستورات لینوکس میتوانید از کد زیر کمک بگیرید:

import os
os.system('pwd')
os.system('cd ~')
os.system('ls -la')

این 4 خط دایرکتوری فعلی شما را بررسی می کند، مکان را به دایرکتوری اصلی شما تغییر می دهد و تمام محتویات را با جزئیات لیست می کند. این کد یک پیاده سازی بسیار ساده است، اما یک نقطه ضعف در آن وجود دارد. با تابع system() اجازه ندارید خروجی حاصل را به عنوان یک متغیر ذخیره کنید.

در عوض، می‌توانید از متد ()popen استفاده کنید که در ماژول os قرار گرفته است. این دستور یک ارتباط بین فرمان ها برقرار میکند و باعث میشود در پایتون قابل دسترسی باشد. برای استفاده از ()popen برای ذخیره خروجی به عنوان یک متغیر، کد مثال زیر را ببینید.

import os
stream = os.popen('ls -la')
output = stream.readlines()

اگر متغیر strem را چاپ کنید، داده های برگشتی آن را خواهید دید. این شامل دستورات اجرا شده، حالت و آدرس است. علاوه بر این، اگر می خواهید کل خروجی را به صورت یک رشته دریافت کنید، readlines() را به read() تغییر دهید.

استفاده از ماژول subprocess

راه دوم برای اجرای دستورات لینوکس با پایتون، استفاده از ماژول subprocess است. این ماژول جدید تر است و به شما اجازه می دهد تا فرآیندهای جدید را ایجاد کنید، شما میتوانید به پایپ های ورودی/خروجی/خطا متصل شوید و کدهای برگشتی آنها را دریافت کنید. این ماژول برای جایگزینی توابع os.system() و os.popen() ایجاد شده است.

تنها متودی که در subprocess اهمیت دارد run() است. با استفاده از آن و با استفاده از آرگومان های مختلف، می توانید تمام کارهایی را که در بالا انجام دادیم و حتی بیشتر انجام دهید. از کدهای زیر به عنوان مرجع استفاده کنید:

نوشتن یک فرمان ساده با استفاده از فرآیند فرعی

import subprocess

subprocess.run('ls')

استفاده از متودی مانند این دستور ls را در ترمینال شما اجرا می کند. برخلاف os.system()، وقتی یک سوئیچ اضافه می کنید و آن را کاملاً مانند subprocess.run ('ls -la') وارد می کنید، کار نمی کند. برای اجرای ls -la، باید دستور را به صورت لیست ارسال کنید: subprocess.run(['ls','-la')

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

نوشتن یک فرمان با سوئیچ ها

import subprocess
x = subprocess.run(['ls', '-la'])
import subprocess
subprocess.run(['ls -la'], shell=True)

در مرحله بعد، برای ذخیره خروجی فرمان در یک متغیر، میتوانید به سادگی آن را در یک متغیر بریزید اما، نتیجه آن چیزی که شما انتظار دارید نخواهد بود. از آنجایی که هدف اصلی “run” اجرای فرمان shell در پایتون است، نتیجه مانند خروجی ای که در ترمینال می بینید نخواهد بود.  با استفاده از کد زیر می توانید آن را بررسی کنید.

ذخیره سازی خروجی فرمان در یک متغیر

import subprocess

x = subprocess.run(['ls', '-la'])
print(x)
print(x.args)
print(x.returncode)
print(x.stdout)
print(x.stderr)

این کد داده های برگشتی دستور شما را با استفاده از آرگومان های متد تجزیه می کند. در اینجا برخی از متود های پرکاربرد توضیح داده شده است:

  • args – دستورات اجرا شده را بر میگرداند
  • returncode – وضعیت برگشتی خروجی را برمی گرداند. 0 یعنی بدون خطا
  • stdout – گرفتن stdout از فرآیند
  • stderr – جریان stderr از فرآیند

از آنجایی که ما خروجی کد قبلی را نگرفتیم، با آرگومان های stdout و stderr خروجی ‘none’ دریافت خواهیم کرد. برای فعال کردن آرگومان خروجی گرفتن، به کد زیر مراجعه کنید:

import subprocess
x = subprocess.run(['ls', '-la'], capture_output=True)

اگر x را چاپ کنید، لیستی از موارد موجود در دایرکتوری فعلی خود را از نوع بایت دریافت خواهید کرد. میتوانید با نوشتن ()x.stdout.decode آن را به رشته تبدیل کنید. یا می توانید آرگومان text=True را با تابع main ارسال کنید. اکنون خروجی باید دقیقاً همان چیزی باشد که در ترمینال دارید.

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

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

ذخیره خروجی فرمان در یک فایل متنی

import subprocess
with open('list.txt', 'w') as f:
    subprocess.run(['ls','-la'], stdout=f)

برای اجرای سریع یک اسکریپت کوتاه، از متدهای os.system() و os.popen() استفاده کنید. اما اگر اسکریپت جامع تری برای اجرا دارید، ممکن است بخواهید به جای آن از ماژول subprocess استفاده کنید. ممنون که خواندید و اگر سوالی دارید حتما در نظرات اعلام کنید.

3.7 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *