До Python-3.5 эти три функции включали высокоуровневый API для модуля subprocess
. Теперь вместо них можно использовать функцию subprocess.run()
, но многие существующие коды все еще вызывают устаревшие функции, которые перечислены ниже.
subprocess.call()
,subprocess.check_call()
,subprocess.check_output()
.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'