Python - Выполнить процесс -> Блокировать до выхода и подавить вывод - PullRequest
9 голосов
/ 01 апреля 2010

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

subprocess.Popen(["scanx", "--udp", host], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Ответы [ 2 ]

7 голосов
/ 01 апреля 2010

Если вам вообще не нужен вывод, вы можете передать 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 голосов
/ 01 апреля 2010

Использование subprocess.call(). Из документов:

subprocess.call (* popenargs, ** kwargs)
Запустите команду с аргументами. Дождитесь завершения команды, затем вернуть атрибут кода возврата. Аргументы такие же, как и для Попен конструктор.

Edit:

subprocess.call() использует wait(), а wait() уязвим для тупиков (как указал Томми Герберт). Из документов:

Предупреждение: это приведет к тупику, если дочерний процесс генерирует достаточно вывода к трубе stdout или stderr так, чтобы блокирует ожидание канала ОС буфер, чтобы принять больше данных. использование общаться (), чтобы избежать этого.

Итак, если ваша команда генерирует много выходных данных, используйте communicate() вместо:

p = subprocess.Popen(
    ["scanx", "--udp", host],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
out, err = p.communicate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...