Come posso scoprire perché subprocess.Popen wait () aspetta per sempre se stdout = PIPE?

StackOverflow https://stackoverflow.com/questions/1445627

  •  22-07-2019
  •  | 
  •  

Domanda

Ho un programma che scrive su stdout e possibilmente stderr. Voglio eseguirlo da Python, catturando lo stdout e lo stderr. Il mio codice è simile a:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

Per un paio di programmi, funziona benissimo, ma quando ne ho aggiunto uno nuovo, quello nuovo si blocca per sempre. Se rimuovo stdout = PIPE , il programma scrive il suo output sulla console e termina e tutto va bene. Come posso determinare cosa sta causando il blocco?

Uso di Python 2.5 su Windows XP. Il programma non legge da stdin né ha alcun tipo di input dell'utente (vale a dire "premere un tasto").

È stato utile?

Soluzione

Quando il buffer di una pipe si riempie (in genere 4KB o giù di lì), il processo di scrittura si interrompe fino a quando un processo di lettura non ha letto alcuni dei dati in questione; ma qui non stai leggendo nulla fino a quando il sottoprocesso non è terminato, quindi il deadlock. I documenti su wait inseriscilo molto chiaramente:

  

Avviso Questo si bloccherà se il   il processo figlio genera un output sufficiente   a un tubo stdout o stderr tale che   blocca in attesa della pipe del sistema operativo   buffer per accettare più dati. Uso   communic () per evitarlo.

Se non riesci a utilizzare communic per qualche motivo, fai in modo che il sottoprocesso scriva su un file temporaneo, quindi puoi attendere e leggere quel file quando è pronto - - la scrittura in un file, anziché in una pipe, non comporta il deadlock.

Altri suggerimenti

Dai un'occhiata ai docs . Indica che non dovresti usare wait in quanto può causare un dead dead lock. Prova a utilizzare communic .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top