Python, будучи универсальным языком программирования, предлагает широкий набор библиотек и модулей для упрощения сложных задач. Одним из таких мощных модулей является модуль «подпроцесс», который позволяет разработчикам создавать новые процессы, подключаться к их каналам ввода/вывода/ошибки и получать их коды возврата. В этой статье мы рассмотрим распространенные варианты использования модуля подпроцесса и предоставим практические примеры кода для демонстрации его возможностей.

Общие случаи использования:

Выполнение внешних команд:

Модуль подпроцесса позволяет нам выполнять внешние команды из скрипта Python. Это особенно полезно, когда нам нужно взаимодействовать с базовой операционной системой или использовать существующие инструменты командной строки. Давайте рассмотрим пример, в котором мы выполняем команду «ls», чтобы вывести список файлов в каталоге:

import subprocess

# Execute the "ls" command
result = subprocess.run(['ls'], capture_output=True, text=True)

# Print the output
print(result.stdout)

Выход:

file1.txt
file2.txt
file3.txt

Захват выходных данных и потоков ошибок:

Помимо выполнения команд, модуль подпроцесса позволяет нам захватывать выходные данные и потоки ошибок, сгенерированные исполняемым процессом. Это позволяет нам программно обрабатывать вывод или обрабатывать любые ошибки, которые могут возникнуть. Давайте расширим предыдущий пример, чтобы захватить поток ошибок:

import subprocess

# Execute the "ls" command with an invalid option
result = subprocess.run(['ls', '-z'], capture_output=True, text=True)

# Print the output and error streams
print(result.stdout)
print(result.stderr)

Выход:

ls: illegal option -- z
usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]

Запуск команд оболочки:

Модуль подпроцесса также поддерживает выполнение команд оболочки. Это может быть полезно, когда нам нужно использовать возможности оболочки, такие как перенаправление ввода/вывода, конвейеры или расширения оболочки. Рассмотрим следующий пример, в котором команды оболочки используются для подсчета количества строк в файле:

import subprocess

# Execute shell commands
result = subprocess.run('cat file.txt | wc -l', capture_output=True, text=True, shell=True)

# Print the output
print(result.stdout)

Выход:

10

Управление вводом и выводом:

Модуль подпроцесса позволяет нам управлять входными и выходными потоками исполняемого процесса. Это позволяет нам передавать входные данные в процесс и фиксировать его выходные данные в режиме реального времени. Давайте посмотрим на пример, где мы используем ввод из файла и захватываем вывод построчно:

import subprocess

# Execute a command with input from a file
with open('input.txt', 'r') as f:
    result = subprocess.run(['grep', 'python'], input=f, capture_output=True, text=True)

# Print the output line by line
for line in result.stdout.splitlines():
    print(line)

Выход:

Python is a powerful programming language.
Python's simplicity and versatility make it popular among developers.

Заключение:

Модуль подпроцесса в Python предоставляет надежный и гибкий способ взаимодействия с внешними командами, управления потоками ввода/вывода и регистрации ошибок. Его способность выполнять команды оболочки и обрабатывать сложные сценарии делает его ценным инструментом для системной автоматизации, обработки данных и многого другого. Используя возможности модуля подпроцесса, разработчики могут добиться большего контроля и эффективности при работе с внешними процессами в своих приложениях Python.