Domanda

Di 'Scrivo questo:

from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)

Ora, se faccio

line = p.stdout.readline()

il mio programma attende che il sottoprocesso emette la riga successiva.

C'è qualche magia che posso fare per p.stdout così che ho potuto leggere l'output se è lì, ma basta continuare altrimenti? Sto cercando qualcosa di simile Queue.get_nowait()

So che posso solo creare un thread per la lettura p.stdout, ma supponiamo che non posso creare nuove discussioni.

È stato utile?

Soluzione

Utilizza il modulo select nella libreria standard di Python, vedi http://docs.python.org/ biblioteca / select.html . select.select([p.stdout.fileno()], [], [], 0) ritorna immediatamente una tupla i cui elementi sono tre liste:. il primo sta per essere non vuoto se c'è qualcosa da leggere su quel descrittore di file

Altri suggerimenti

Usa p.stdout.read(1) questo leggerà carattere per carattere

Ed ecco un esempio 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top