Existe uma maneira para consultar um identificador de arquivo retornado de subprocess.Popen?
-
22-08-2019 - |
Pergunta
Say I escrever isto:
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Agora, se eu faço
line = p.stdout.readline()
Meu programa espera até que o subprocesso saídas a próxima linha.
Existe alguma magia que posso fazer para p.stdout
para que eu pudesse ler a saída se ele está lá, mas apenas continuar o contrário? Eu estou procurando algo como Queue.get_nowait()
Eu sei que eu posso simplesmente criar um segmento para leitura p.stdout
, mas vamos supor que eu não pode criar novos tópicos.
Solução
Use o módulo select
na biblioteca padrão do Python, consulte http://docs.python.org/ biblioteca / select.html . select.select([p.stdout.fileno()], [], [], 0)
retorna imediatamente um tuplo cujos itens são três listas:. o primeiro vai ser não-vazia, se há algo para ler sobre esse descritor de arquivo
Outras dicas
Use p.stdout.read(1)
este personagem vai ler pelo caráter
E aqui está um exemplo completo:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()