Модуль subprocess в Python

subprocess— модуль в стандартной библиотеке Python, используемый для создания и управления подпроцессами.

subprocessОн позволяет выполнять внешние команды в программах на Python и взаимодействовать с этими командами.

Черезsubprocessмодуль, вы можете выполнять системные команды, вызывать другие программы и получать их вывод или сообщения об ошибках.

Почему стоит использовать модуль subprocess?

В Python иногда нам нужно выполнять системные команды или вызывать другие программы для выполнения конкретных задач. Например, вам может потребоваться запустить команду оболочки, запустить внешнее приложение или взаимодействовать с инструментом командной строки.subprocessМодуль предоставляет безопасный и гибкий способ решения этих задач.

По сравнению с более раннимиos.system()илиos.popen()подходами,subprocessмодуль предоставляет более мощную функциональность и лучший контроль. Он позволяет более тонко управлять потоками ввода, вывода и ошибок подпроцессов и может обрабатывать более сложные сценарии.


Основные возможности модуля subprocess

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

subprocess.run()ДаsubprocessОдна из наиболее часто используемых функций в модуле. Она может выполнить внешнюю команду и дождаться завершения команды. Вот простой пример:

Пример

import subprocess

# Выполнить простую команду оболочки
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# Вывести вывод команды
print(result.stdout)

В этом примере,subprocess.run()выполнилls -lкоманду и захватил вывод вresult.stdoutрезультат.

2. Обработка ввода и вывода

subprocessМодуль позволяет управлять потоками ввода, вывода и ошибок подпроцессов. Вы можете передавать данные в стандартный ввод подпроцесса или читать данные из стандартного вывода и стандартного потока ошибок подпроцесса. Вот пример:

Пример

import subprocess

# Выполнить команду и передать ввод подпроцессу
result = subprocess.run(['grep', 'python'], input='hello\npython\nworld', capture_output=True, text=True)

# Вывести вывод команды
print(result.stdout)

В этом примере,subprocess.run()выполнилgrep pythonкоманду и передали строку'hello\npython\nworld'в качестве входных данных для подпроцесса.

3. Обработка ошибок

subprocessМодуль также позволяет обрабатывать ошибки подпроцессов. Если подпроцесс возвращает ненулевой код состояния выхода,subprocess.run()он возбудитCalledProcessErrorисключение.result.returncodeВы можете проверить

Пример

import subprocess

try:
    result = subprocess.run(['ls', 'nonexistent_file'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")
    print(f"Error output: {e.stderr}")

Примерsubprocess.run()В этом примере,ls nonexistent_fileвыполнилCalledProcessErrorкоманду. Поскольку файл не существует, команда завершилась с ошибкой и возбудила


Расширенное использование модуля subprocess

1. Использование класса Popen

subprocess.Popen1. Использование класса PopenPopenКласс предоставляет низкоуровневый интерфейс, который позволяет более гибко управлять подпроцессами. Вы можете использовать

Пример

import subprocess

Пример
process = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE, text=True)

# Запуск подпроцесса
while True:
    output = process.stdout.readline()
    if output == '' and process.poll() is not None:
        break
    if output:
        print(output.strip())

# Чтение вывода подпроцесса
return_code = process.poll()
print(f"Процесс завершен с кодом возврата {return_code}")

# Получить код завершения подпроцессаsubprocess.PopenВ этом примере,ping google.comзапустил

2. Использование каналов

subprocess2. Использование каналов

Пример

import subprocess

Пример
p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'py'], stdin=p1.stdout, stdout=subprocess.PIPE, text=True)

# Использовать канал для соединения двух команд
output = p2.communicate()[0]
print(output)

# Получить итоговый выводls -lВ этом примере,grep pyвывод команды передаётся вpyкоманда, и итоговый вывод содержит


Общие методы, классы и параметры модуля subprocess

Ниже приведено описание общих методов, классов и параметров модуля subprocess Python, включая описания функциональности и примеры:

Основные методы модуля subprocess

МетодОписаниеПример
subprocess.run()Выполнить команду и дождаться завершения (рекомендуется)subprocess.run(["ls", "-l"], capture_output=True, text=True)
subprocess.Popen()Создать подпроцесс (низкоуровневое управление)proc = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE)
subprocess.call()Выполнить команду и вернуть код завершения (устаревший)exit_code = subprocess.call(["python", "--version"])
subprocess.check_call()Выполнить команду и возбудить исключение при ошибкеsubprocess.check_call(["git", "commit"])
subprocess.check_output()Выполнить команду и вернуть вывод (устаревший)output = subprocess.check_output(["date"], text=True)

Атрибуты объекта subprocess.CompletedProcess (возвращаемый объект метода run())

AttributeОписание
argsСписок аргументов выполненной команды
returncodeКод состояния завершения процесса (0 означает успех)
stdoutСодержимое стандартного вывода (если заданоcapture_output)
stderrСодержимое стандартного потока ошибок (если заданоcapture_output)

Общие методы/атрибуты класса subprocess.Popen

Метод/атрибутОписаниеПример
poll()Проверить, завершился ли процесс (возвращаетNoneTrue, указывающее, что процесс выполняется)if proc.poll() is None: print("Running")
wait()Блокировать до завершения процессаproc.wait()
communicate()Интерактивный ввод/выводstdout, stderr = proc.communicate(input="data")
terminate()Отправить сигнал завершения (SIGTERM)proc.terminate()
kill()Принудительно завершить процесс (SIGKILL)proc.kill()
stdinСтандартный поток ввода процессаproc.stdin.write("input")
stdoutСтандартный поток вывода процессаprint(proc.stdout.read())
stderrСтандартный поток ошибок процессаerrors = proc.stderr.read()

Общие описания параметров (применимо к run() и Popen())

ПараметрОписаниеПример значения
argsКоманда (список или строка)["ls", "-l"]или"ls -l"
stdinКонфигурация стандартного вводаsubprocess.PIPE(pipe),None(inherit)
stdoutКонфигурация стандартного выводаsubprocess.PIPE、open('log.txt', 'w')
stderrКонфигурация стандартного потока ошибокsubprocess.STDOUT(объединён со stdout)
shellВыполнять ли через ShellTrue(поддерживает строковые команды)
cwdПуть к рабочей директории"/tmp"
envПользовательские переменные среды{"PATH": "/usr/bin"}
timeoutТайм-аут (секунды)30
textЯвляется ли ввод/вывод строкой (а не байтами)True

Пример

Выполнить команду и перехватить вывод:

Пример

result = subprocess.run(["echo", "Hello"], capture_output=True, text=True)
print(result.stdout)  # Вывод: "Hello\n"

Выполнить сложные команды через Shell:

subprocess.run("grep 'error' log.txt | wc -l", shell=True, check=True)
Получить поток вывода в реальном времени:

Пример

proc = subprocess.Popen(["tail", "-f", "log.txt"], stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if not line: break
    print(line.decode().strip())

Управление тайм-аутом:

Пример

try:
    subprocess.run(["sleep", "10"], timeout=5)
except subprocess.TimeoutExpired:
    print("Время ожидания команды истекло!")
Другие расширения