Я использую следующее, чтобы выполнить процесс и скрыть его вывод от Python. Это находится в цикле, хотя, и мне нужен способ заблокироваться, пока подпроцесс не завершился прежде, чем переместиться в следующее повторение.
subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Используйте subprocess.call ()
. Из документации:
subprocess.call (* popenargs, ** kwargs)
Выполнить команду с аргументами. Дождитесь завершения команды, затем верните атрибут returncode. Аргументы такие же, как для конструктора Popen.
Изменить:
subprocess.call ()
использует wait ()
, а wait ()
уязвим для тупиковых ситуаций (как указал Томми Герберт). Из документации:
Предупреждение: это приведет к взаимной блокировке, если дочерний процесс генерирует достаточно вывода в канал stdout или stderr, так что блокирует ожидание канала ОС { {1}} буфер для приема дополнительных данных. Чтобы этого избежать, используйте messages ().
Поэтому, если ваша команда генерирует много выходных данных, используйте вместо этого communication ()
:
p = subprocess.Popen(
["scanx", "--udp", host],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
Если вам вообще не нужен вывод, вы можете передать devnull в stdout
и stderr
. Я не знаю, может ли это иметь значение, но передайте bufsize. Теперь с помощью devnull subprocess.call
больше не возникает тупиковых ситуаций
import os
import subprocess
null = open(os.devnull, 'w')
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null)