Сообщить об ошибке.

Устаревшие функции модуля subprocess

До Python-3.5 эти три функции включали высокоуровневый API для модуля subprocess. Теперь вместо них можно использовать функцию subprocess.run(), но многие существующие коды все еще вызывают устаревшие функции, которые перечислены ниже.

Содержание:


subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None):

Функция subprocess.call() запускает команду, описанную аргументами args, дожидается завершения команды, а затем возвращает кода завершения программы returncode.

Вместо функции subprocess.call() теперь необходимо использовать универсальную функцию subprocess.run() следующим образом:

proc = subprocess.run(...)
proc.returncode

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

Функция subprocess.call() передает все свои аргументы напрямую в интерфейс subprocess.Popen(), кроме времени ожидания timeout.

Примечание.

  • Не используйте stdout=subprocess.PIPE или stderr=subprocess.PIPE с этой функцией. Дочерний процесс блокируется, если он генерирует достаточно данных для канала, тем самым заполняя буфер канала ОС.

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None):

Функция subprocess.check_call() запускает команду с аргументами, дожидается завершения команды и возвращает 0 если код завершения программы был равен нулю, в противном случае вызывает исключение CalledProcessError. Объект CalledProcessError будет иметь код завершения в атрибуте returncode.

Вместо функции subprocess.check_call() теперь необходимо использовать subprocess.run() следующим образом:

proc = subprocess.run(..., check=True)

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

Функция subprocess.check_call() передает все свои аргументы напрямую в интерфейс subprocess.Popen(), кроме времени ожидания timeout.

Примечание.

  • Не используйте stdout=subprocess.PIPE или stderr=subprocess.PIPE с этой функцией. Дочерний процесс блокируется, если он генерирует достаточно данных для канала, тем самым заполняя буфер канала ОС.

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None):

Функция subprocess.check_output() запускает команду с аргументами и возвращает ее вывод.

Если код возврата был ненулевым, то функция вызывала исключение CalledProcessError. Объект CalledProcessError будет иметь код завершения в атрибуте returncode и любые выходные данные в атрибуте output.

Теперь функция subprocess.check_output() эквивалентна следующему коду:

proc = subprocess.run(..., check=True, stdout=PIPE)
proc.stdout

Полная сигнатура функции subprocess.check_output() в значительной степени совпадает с сигнатурой subprocess.run() - большинство аргументов передаются напрямую в этот интерфейс. Однако явная передача input=None для наследования стандартного дескриптора входного файла родителя не поддерживается.

По умолчанию эта функция возвращает данные в виде закодированных байтов. Фактическое кодирование выходных данных может зависеть от вызываемой команды, поэтому часто требуется декодирование в текста на уровне приложения.

Это поведение может быть переопределено путем определения аргументов encoding и errors или text=True (также известный как universal_newlines) как описано в разделе "Часто используемые аргументы." и в описании функции ​​subprocess.run().

Чтобы перенаправить ошибки выполнения команды в stdout, используйте аргумент stderr=subprocess.STDOUT:

>>> import subprocess
>>> proc = subprocess.run('ls non_existent_file; exit 0', stdout=subprocess.PIPE, \
                          stderr=subprocess.STDOUT, shell=True, encoding='utf-8')
>>> proc.stdout
# 'ls: non_existent_file: Нет такого файла или каталога\n'