Pergunta

Se este é o meu subprocesso:

import time, sys
for i in range(200):
    sys.stdout.write( 'reading %i\n'%i )
    time.sleep(.02)

E este é o script controlando e modificando a saída do subprocesso:

import subprocess, time, sys

print 'starting'

proc = subprocess.Popen(
    'c:/test_apps/testcr.py',
    shell=True,
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE  )

print 'process created'

while True:
    #next_line = proc.communicate()[0]
    next_line = proc.stdout.readline()
    if next_line == '' and proc.poll() != None:
        break
    sys.stdout.write(next_line)
    sys.stdout.flush()

print 'done'

Por que é readline e communicate Esperando até que o processo seja feito em execução? Existe uma maneira simples de passar (e modificar) o tempo real do subprocesso?

Btw eu vi isto, mas não preciso dos recursos de registro (e não me incomodar em entender muito disso).

Estou no Windows XP.

Foi útil?

Solução

Como Charles já mencionou, o problema está em buffer. Eu fui para um problema semelhante ao escrever alguns módulos para o SNMPD e resolvi substituindo o STDOUT por uma versão automática.

Eu usei o código a seguir, inspirado em algumas postagens no Activestate:

class FlushFile(object):
    """Write-only flushing wrapper for file-type objects."""
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()

# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)

Outras dicas

A saída do processo é tamponada. Em mais sistemas operacionais Unixy (ou cygwin), o pexpect O módulo está disponível, que recita todos os encantamentos necessários para evitar problemas relacionados ao buffer. No entanto, esses encantamentos exigem um trabalho módulo pty, que não está disponível nas compilações nativas (não cignas) do Python Win32.

No exemplo de caso em que você controla o subprocesso, você pode apenas ligar para sys.stdout.flush() Onde necessário - mas para subprocessos arbitrários, essa opção não está disponível.

Veja também A pergunta "Por que não usar apenas um tubo (Popen ())?" Nas Perguntas frequentes pexpect.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top