Python - Выполняет Процесс-> Блок, пока он не выходит, и Подавите Вывод

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

subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
9
задан Cœur 11 August 2017 в 15:39
поделиться

2 ответа

Используйте 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()
7
ответ дан 4 December 2019 в 14:27
поделиться

Если вам вообще не нужен вывод, вы можете передать 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)
7
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: