import subprocess subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
Аргументы функции, за исключением обязательного args
- являются не обязательны и следовательно задаются только ключевыми словами.
args
- запускаемая программа с аргументами,stdin=None
- поток данных, отправляемых в процесс,input=None
- поток данных, отправляемых в процесс,stdout=None
- поток вывода программы,stderr=None
- поток ошибок программы,capture_output=False
- захват вывода stdout
и stderr
,shell=False
- используйте True
, если программа и ее аргументы представлены как одна строка,cwd=None
- путь к рабочему каталогу запускаемой программы,timeout=None
- максимально-допустимое время выполнения запущенной программы,check=False
- вызывает исключение при завершении запущенной программы с ошибками,encoding=None
- кодировка, если input
- строка,errors=None
- обработчик ошибок кодировки,text=None
- текстовый режим для stdin
, stdout
и stderr
,env=None
- переменные среды для нового процесса,universal_newlines=None
- тоже, что и параметр text
.Ключевые аргументы этой функции это лишь наиболее распространенные параметры, правила использования которых описанными в разделе "Часто используемые аргументы".
CompletedProcess()
с результатами работы.Функция run()
модуля subprocess
запускает команду/скрипт/программу с аргументами, ждет завершения команды, а затем возвращает экземпляр CompletedProcess()
с результатами работы.
Полная сигнатура функции subprocess.run()
в значительной степени совпадает с сигнатурой конструктора subprocess.Popen()
, a большинство аргументов этой функции передаются в интерфейс последней кроме параметров timeout
, input
, check
и capture_output
.
Если аргумент capture_output
() имеет значение True
, то вывод stdout
и stderr
будут захвачены. При использовании, внутренний объект subprocess.Popen()
автоматически создается с stdout=subprocess.PIPE
и stderr=subprocess.PIPE
. Аргументы stdout
и stderr
не могут быть предоставлены одновременно с capture_output
. Если необходимо захватить и объединить оба потока в один, то используйте stdout=subprocess.PIPE
и stderr=subprocess.STDOUT
вместо capture_output=True
.
Аргумент timeout
передается в subprocess.Popen.communicate()
. Если тайм-аут истекает, то дочерний процесс, в котором запущена программа будет принудительно остановлен и ожидание завершения процесса прекращается. Исключение subprocess.TimeoutExpired
будет повторно вызвано после завершения дочернего процесса.
Аргумент input
передается в subprocess.Popen.communicate()
и следовательно в стандартный поток дочернего процесса. Если он используется, то это должна быть последовательность байтов или строка - если задана кодировка encoding
и errors
или аргумент text
имеет значение True
. При использовании аргумента input
, внутренний объект subprocess.Popen
автоматически создается с помощью значения аргумента stdin=subprocess.PIPE
при этом сам аргумент stdin
может не указываться.
Если аргумент check=True
и процесс завершается с ненулевым кодом выхода, то будет вызвано исключение subprocess.CalledProcessError
. Атрибуты этого исключения содержат аргументы запуска программы, код ее выхода, а так же stdout
и stderr
, если они были захвачены.
Если указаны кодировка encoding
или errors
или аргумент text
имеет значение True
, то файловые объекты для stdin
, stdout
и stderr
открываются в текстовом режиме с использованием указанной кодировки и обработчика ошибок или значения по умолчанию io.TextIOWrapper()
.
Значение аргумента universal_newlines
эквивалентно аргументу text
и предназначен для обратной совместимости. По умолчанию файловые объекты открываются в двоичном режиме.
Если аргумент env
не равен None
, то это должен быть словарь, который определяет переменные среды для нового процесса. Он используются вместо поведения по умолчанию - наследования среды текущего процесса. Аргумент env
непосредственно передается в конструктор subprocess.Popen()
.
>>> import subprocess >>> result = subprocess.run(['ls', '-ls', '/tmp']) # итого 44 # 4 drwxrwxr-x 2 docs-python docs-python 4096 мая 12 09:39 closeditems # 0 srwx------ 1 sddm sddm 0 мая 12 08:51 sddm-:0-gYOiIB # 4 drwx------ 2 docs-python docs-python 4096 мая 12 09:03 ssh-SGQxwtKxNQGo # 4 -rw------- 1 docs-python docs-python 317 мая 12 09:56 tmp-26999MFPH5MgIW157.tpl # 4 drwx------ 2 docs-python docs-python 4096 мая 12 09:12 'VSCode Crashes' # 4 -rw------- 1 docs-python docs-python 110 мая 12 09:03 xauth-1000-_0 # ...
Чтобы вызывать команды, в которых используются wildcard-выражения *tpl
, нужно добавлять аргумент shell
.
>>> import subprocess >>> result = subprocess.run('ls -ls /tmp/*tpl', shell=True) # 4 -rw------- 1 docs-python docs-python 317 мая 12 09:56 /tmp/tmp-26999MFPH5MgIW157.tpl >>> result.returncode # 0
Получение результата выполнения команды, если не указать параметр encoding
, то результат получим как байтовую строку.
>>> import subprocess >>> result = subprocess.run('ls -ls /tmp/*tpl', shell=True, \ stdout=subprocess.PIPE, encoding='utf-8') >>> result.stdout # '4 -rw------- 1 docs-python docs-python 317 мая 12 09:56 /tmp/tmp-26999MFPH5MgIW157.tpl\n' >>> result.returncode # 0
Отключение вывода.
>>> import subprocess >>> result = subprocess.run(['ls', '-ls', '/tmp/'], stdout=subprocess.DEVNULL) >>> print(result.stdout) # None >>> result.returncode # 0 >>> result.args # ['ls', '-ls', '/tmp/']
Если команда была выполнена с ошибкой или не отработала корректно, вывод команды попадет на стандартный поток ошибок.
Получить этот вывод можно так же, как и стандартный поток вывода:
>>> import subprocess >>> result = subprocess.run(['ping', '-c', '3', '-n', 'host.host'], \ stderr=subprocess.PIPE, encoding='utf-8') >>> result.stderr # 'ping: host.host: Неизвестное имя или служба\n'
Функция ping()
проверяет доступность адреса address
и возвращает stdout
, если адрес доступен или stderr
, если адрес недоступен.
import subprocess def ping(address): reply = subprocess.run(['ping', '-c', '3', '-n', address], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8') if reply.returncode == 0: return reply.stdout else: return reply.stderr >>> print(ping('yandex.ru')) # PING yandex.ru (5.255.255.5) 56(84) bytes of data. # 64 bytes from 5.255.255.5: icmp_seq=1 ttl=249 time=20.0 ms # 64 bytes from 5.255.255.5: icmp_seq=2 ttl=249 time=20.2 ms # 64 bytes from 5.255.255.5: icmp_seq=3 ttl=249 time=20.2 ms # # --- yandex.ru ping statistics --- # 3 packets transmitted, 3 received, 0% packet loss, time 2002ms # rtt min/avg/max/mdev = 20.058/20.166/20.220/0.076 ms >>> print(ping('host.ho')) # ping: host.ho: Неизвестное имя или служба >>> print(ping('10.10.10.10')) # PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. # 64 bytes from 10.10.10.10: icmp_seq=1 ttl=64 time=0.201 ms # 64 bytes from 10.10.10.10: icmp_seq=2 ttl=64 time=0.212 ms # 64 bytes from 10.10.10.10: icmp_seq=3 ttl=64 time=0.201 ms # # --- 10.10.10.10 ping statistics --- # 3 packets transmitted, 3 received, 0% packet loss, time 2027ms # rtt min/avg/max/mdev = 0.201/0.204/0.212/0.017 ms