Як виконувати зовнішні команди в Python

Як виконувати зовнішні команди в Python
Як виконувати зовнішні команди в Python

Запуск системних команд з Python

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

Надані сценарії демонструють різні способи виконання зовнішніх команд за допомогою Python. The subprocess.run Команда є універсальною, що дозволяє запускати команди оболонки безпосередньо зі сценарію Python. Наприклад, subprocess.run(['echo', 'Hello, World!']) друкує повідомлення на консоль, поки subprocess.run(['ls', '-l'], capture_output=True, text=True) фіксує вихідні дані ls -l команда, що відображає детальний список каталогу. Використання shell=True з subprocess.run дозволяє використовувати функції оболонки, як-от розширення символів підстановки, що робить його зручним для більш складних команд.

The subprocess.Popen Команда забезпечує більше контролю над виконанням команд, дозволяючи асинхронне виконання команд і взаємодію з вхідними та вихідними потоками процесу. Наприклад, приклад сценарію з subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) постійно перевіряє локальну машину та читає кожен рядок виводу. Крім того, os.system використовується для простого виконання команд, але йому бракує гнучкості subprocess. Змінні середовища можна змінювати та передавати підпроцесу за допомогою os.environ.copy() і env параметр в subprocess.run, що дозволяє динамічно виконувати команди на основі середовища.

Виконання зовнішніх команд у Python

Використання модуля підпроцесу Python

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())

Автоматизація системних завдань за допомогою Python

Використання модулів os.system і subprocess

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())

Передові методи виконання системних команд

Ще один аспект виконання системних команд у Python передбачає використання shlex модуль для обробки команд оболонки. Цей модуль надає спосіб розділити команди оболонки на формат списку, який потім можна передати subprocess функції. Це гарантує коректну обробку аргументів із пробілами. Крім того, ви можете використовувати subprocess.PIPE щоб спрямувати стандартні потоки вводу, виводу та помилок до батьківського процесу, забезпечуючи більш складну взаємодію між процесами.

Наприклад, ланцюжок команд і послідовна обробка їх виводу може бути досягнута шляхом передачі виводу однієї команди в іншу за допомогою subprocess.Popen. Це дозволяє створювати потужні послідовності команд, подібні до того, що ви робили б у сценарії оболонки. Ви також можете використовувати threading для одночасного запуску кількох команд підпроцесу, підвищуючи ефективність вашого сценарію, особливо під час роботи із завданнями, пов’язаними з введенням/виведенням.

Часті запитання щодо виконання системних команд у Python

  1. Як я можу запустити команду оболонки та отримати її вихід у Python?
  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 для керування фоновим виконанням.

Передові методи виконання системних команд

Ще один аспект виконання системних команд у Python передбачає використання shlex модуль для обробки команд оболонки. Цей модуль надає спосіб розділити команди оболонки на формат списку, який потім можна передати subprocess функції. Це гарантує, що аргументи з пробілами обробляються правильно. Крім того, ви можете використовувати subprocess.PIPE щоб спрямувати стандартні потоки вводу, виводу та помилок до батьківського процесу, дозволяючи більш складну комунікацію між процесами.

Наприклад, ланцюжок команд і послідовна обробка їх виводу може бути досягнута шляхом передачі виводу однієї команди в іншу за допомогою subprocess.Popen. Це дозволяє створювати потужні послідовності команд, подібні до того, що ви робили б у сценарії оболонки. Ви також можете використовувати threading для одночасного запуску кількох команд підпроцесу, підвищуючи ефективність вашого сценарію, особливо під час роботи із завданнями, пов’язаними з введенням/виведенням.

Останні думки про виконання команд у Python

Виконання зовнішніх команд у Python — це універсальна та потужна можливість, яка може значно покращити ваші сценарії та завдання автоматизації. За допомогою subprocess модуль, ви можете запускати команди оболонки, отримувати їхні виходи та ефективно обробляти помилки. The os.system функція надає простішу альтернативу для базового виконання команд. Крім того, включає в себе shlex модуль забезпечує правильний аналіз складних команд оболонки. Розуміння цих прийомів дає змогу використовувати сильні сторони Python, одночасно використовуючи весь потенціал інструментів командного рядка вашої операційної системи.