كيفية تنفيذ الأوامر الخارجية في بايثون

كيفية تنفيذ الأوامر الخارجية في بايثون
كيفية تنفيذ الأوامر الخارجية في بايثون

تشغيل أوامر النظام من بايثون

توفر Python إمكانات قوية لتنفيذ البرامج الخارجية وأوامر النظام مباشرة من البرامج النصية الخاصة بك. تتيح لك هذه الميزة الاستفادة من بساطة Python مع الاستفادة من المجموعة الواسعة من الأدوات المتوفرة في نظام التشغيل الخاص بك.

سواء كنت تقوم بأتمتة المهام المتكررة أو دمج مسارات العمل المعقدة، فإن فهم كيفية استدعاء أوامر النظام في Python يمكن أن يعزز إنتاجيتك بشكل كبير. وفي هذا الدليل، سنستكشف طرقًا مختلفة لتحقيق ذلك بفعالية.

يأمر وصف
subprocess.run ينفذ أمرا في قذيفة فرعية. يمكن التقاط المخرجات والأخطاء.
subprocess.run([...], capture_output=True) يلتقط الإخراج القياسي والخطأ القياسي للأمر الذي تم تنفيذه.
subprocess.run([...], shell=True) يقوم بتشغيل الأمر من خلال الصدفة، مما يسمح بميزات الصدفة مثل أحرف البدل.
subprocess.Popen ينفذ أمرًا في عملية جديدة، مما يوفر مزيدًا من التحكم في تنفيذه.
process.stdout.readline() يقرأ سطر الإخراج من الإخراج القياسي للعملية.
os.system ينفذ أمرًا في غلاف فرعي، يُستخدم بشكل شائع لتنفيذ أمر بسيط.
subprocess.check_output يقوم بتشغيل الأمر وإرجاع مخرجاته. يثير استثناءً في حالة فشل الأمر.
os.environ.copy() إنشاء نسخة من متغيرات البيئة الحالية، مع السماح بالتعديلات.
env parameter in subprocess.run يحدد متغيرات البيئة للعملية الجديدة.

فهم تنفيذ البرنامج النصي في بايثون

توضح البرامج النصية المقدمة طرقًا مختلفة لتنفيذ الأوامر الخارجية باستخدام Python. ال subprocess.run الأمر متعدد الاستخدامات، مما يسمح لك بتشغيل أوامر shell مباشرة من برنامج Python النصي الخاص بك. على سبيل المثال، subprocess.run(['echo', 'Hello, World!']) طباعة رسالة إلى وحدة التحكم، في حين subprocess.run(['ls', '-l'], capture_output=True, text=True) يلتقط إخراج ls -l الأمر، وعرض قائمة دليل مفصلة. استخدام shell=True مع subprocess.run يسمح باستخدام ميزات الصدفة، مثل توسيع أحرف البدل، مما يجعله مفيدًا للأوامر الأكثر تعقيدًا.

ال subprocess.Popen يوفر الأمر مزيدًا من التحكم في تنفيذ الأمر من خلال السماح بتشغيل الأوامر غير المتزامنة والتفاعل مع تدفقات الإدخال والإخراج الخاصة بالعملية. على سبيل المثال، المثال النصي مع subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) يقوم بإجراء اختبار ping على الجهاز المحلي بشكل مستمر ويقرأ كل سطر من الإخراج. بالإضافة إلى ذلك، os.system يستخدم لتنفيذ الأوامر البسيطة ولكنه يفتقر إلى المرونة subprocess. يمكن تعديل متغيرات البيئة وتمريرها إلى العملية الفرعية باستخدام os.environ.copy() و ال env المعلمة في subprocess.runمما يسمح بتنفيذ الأوامر الديناميكية بناءً على البيئة.

تنفيذ الأوامر الخارجية في بايثون

استخدام وحدة العمليات الفرعية في بايثون

import subprocess
# Example 1: Running a simple shell command
subprocess.run(['echo', 'Hello, World!'])
# Example 2: Capturing the output of a command
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
# Example 3: Running a command with shell=True
subprocess.run('echo Hello from the shell', shell=True)
# Example 4: Checking the return code
result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True)
if result.returncode != 0:
    print('Command failed')
# Example 5: Using subprocess.Popen for more control
process = subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE)
while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.strip().decode())

أتمتة مهام النظام مع بايثون

استخدام وحدات النظام والعمليات الفرعية

import os
import subprocess
# Example 1: Using os.system to run a command
os.system('echo This is a test')
# Example 2: Running a command and capturing output with subprocess
result = subprocess.run(['date'], capture_output=True, text=True)
print('Current date and time:', result.stdout)
# Example 3: Executing multiple commands
commands = ['echo First command', 'echo Second command']
for cmd in commands:
    os.system(cmd)
# Example 4: Running a command with environment variables
env = os.environ.copy()
env['MY_VAR'] = 'Hello'
subprocess.run('echo $MY_VAR', shell=True, env=env)
# Example 5: Handling command errors
try:
    subprocess.check_output(['false_command'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print('An error occurred:', e.output.decode())

التقنيات المتقدمة لتنفيذ أوامر النظام

جانب آخر من جوانب تنفيذ أوامر النظام في بايثون يتضمن استخدام shlex وحدة للتعامل مع تحليل أوامر الصدفة. توفر هذه الوحدة طريقة لتقسيم أوامر الصدفة إلى تنسيق قائمة، والذي يمكن بعد ذلك تمريره إليه subprocess المهام. وهذا يضمن التعامل مع الوسائط ذات المسافات بشكل صحيح. بالإضافة إلى ذلك، يمكنك استخدام subprocess.PIPE لتوجيه المدخلات والمخرجات وتدفقات الأخطاء القياسية إلى العملية الأصلية، مما يسمح باتصال أكثر تعقيدًا بين العمليات.

على سبيل المثال، يمكن تحقيق تسلسل الأوامر ومعالجة مخرجاتها بشكل تسلسلي عن طريق توصيل مخرجات أمر إلى آخر باستخدام subprocess.Popen. يتيح لك هذا إنشاء تسلسلات أوامر قوية مشابهة لما ستفعله في برنامج نصي Shell. تستطيع ايضا استخذام threading لتشغيل أوامر عمليات فرعية متعددة بشكل متزامن، مما يعزز كفاءة البرنامج النصي الخاص بك، خاصة عند التعامل مع المهام المرتبطة بالإدخال/الإخراج.

الأسئلة المتداولة حول تنفيذ أوامر النظام في بايثون

  1. كيف يمكنني تشغيل أمر shell والحصول على مخرجاته في بايثون؟
  2. يستخدم subprocess.run مع capture_output=True لالتقاط إخراج الأمر.
  3. ماهو الفرق بين subprocess.run و subprocess.Popen؟
  4. subprocess.run هي واجهة أبسط تنتظر اكتمال الأمر، بينما subprocess.Popen يعطي مزيدًا من التحكم في تنفيذ الأوامر، مما يسمح بالتشغيل غير المتزامن.
  5. كيف أتعامل مع الأخطاء عند تشغيل أمر النظام؟
  6. يستخدم try و except كتل مع subprocess.CalledProcessError للقبض على الأخطاء والتعامل معها.
  7. هل يمكنني تمرير متغيرات البيئة إلى أمر؟
  8. نعم استخدم env المعلمة في subprocess.run أو subprocess.Popen لتمرير متغيرات البيئة.
  9. كيف يمكنني تشغيل أوامر متعددة بالتسلسل؟
  10. يستخدم subprocess.run أو subprocess.Popen في أوامر حلقة أو سلسلة باستخدام الأنابيب مع subprocess.Popen.
  11. كيف يمكنني تنفيذ أمر يتطلب إدخال المستخدم؟
  12. يستخدم subprocess.Popen مع stdin=subprocess.PIPE والتواصل مع العملية باستخدام process.communicate.
  13. ما هي الفائدة من shlex في تنفيذ الأمر؟
  14. shlex يساعد في تحليل أوامر الصدفة بشكل صحيح، مما يضمن التعامل مع الوسائط ذات المسافات بشكل صحيح.
  15. كيف يمكنني تشغيل أمر في الخلفية؟
  16. يستخدم subprocess.Popen دون انتظار اكتمال العملية أو استخدامها threading لإدارة التنفيذ في الخلفية.

التقنيات المتقدمة لتنفيذ أوامر النظام

جانب آخر من جوانب تنفيذ أوامر النظام في بايثون يتضمن استخدام shlex وحدة للتعامل مع تحليل أوامر الصدفة. توفر هذه الوحدة طريقة لتقسيم أوامر الصدفة إلى تنسيق قائمة، والذي يمكن بعد ذلك تمريره إليه subprocess المهام. وهذا يضمن التعامل مع الوسائط ذات المسافات بشكل صحيح. بالإضافة إلى ذلك، يمكنك استخدام subprocess.PIPE لتوجيه المدخلات والمخرجات وتدفقات الأخطاء القياسية إلى العملية الأصلية، مما يسمح باتصال أكثر تعقيدًا بين العمليات.

على سبيل المثال، يمكن تحقيق تسلسل الأوامر ومعالجة مخرجاتها بشكل تسلسلي عن طريق توصيل مخرجات أمر إلى آخر باستخدام subprocess.Popen. يتيح لك هذا إنشاء تسلسلات أوامر قوية مشابهة لما ستفعله في برنامج نصي Shell. تستطيع ايضا استخذام threading لتشغيل أوامر متعددة للعملية الفرعية بشكل متزامن ، تعزيز كفاءة البرنامج النصي الخاص بك ، خاصة عند التعامل مع مهام I/O المرتبطة.

الأفكار النهائية حول تنفيذ الأوامر في بايثون

يعد تنفيذ الأوامر الخارجية في Python قدرة قوية ومتعددة الاستخدامات يمكنها تحسين مهام البرمجة النصية والأتمتة بشكل كبير. باستخدام subprocess الوحدة، يمكنك تشغيل أوامر shell والتقاط مخرجاتها والتعامل مع الأخطاء بفعالية. ال os.system توفر الوظيفة بديلاً أبسط لتنفيذ الأمر الأساسي. بالإضافة إلى ذلك، دمج shlex تضمن الوحدة التحليل الصحيح لأوامر الصدفة المعقدة. يمكّنك فهم هذه التقنيات من الاستفادة من نقاط قوة Python مع الاستفادة من الإمكانات الكاملة لأدوات سطر الأوامر الخاصة بنظام التشغيل لديك.