Ho un codice Python che esegue un'app esterna che funziona bene quando l'app ha una piccola quantità di output, ma si blocca quando ce n'è molta. Il mio codice è simile:Utilizzo del sottoprocesso.Popen per elaborazione con uscita di grandi dimensioni
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
errmess = p.stderr.read()
if errcode:
log.error('cmd failed <%s>: %s' % (errcode,errmess))
ci sono commenti per i documenti che sembrano indicare il potenziale problema. Sotto di attesa, c'è:
Attenzione: Questo stallo se il processo figlio genera abbastanza uscita ad un tubo
stdout
ostderr
tale che blocca in attesa per il buffer tubo di sistema operativo per accettare altri dati. Utilizzarecommunicate()
per evitare ciò.
però sotto comunicare, vedo:
Note I dati letti vengono accodati in memoria, quindi non utilizzare questo metodo se la dimensione dei dati è grande o illimitata.
Quindi non è chiaro per me che dovrei usare uno di questi se ho una grande quantità di dati. Non indicano quale metodo dovrei usare in quel caso.
Ho bisogno del valore restituito da exec e di analizzare e utilizzare sia lo stdout
e stderr
.
Quindi, qual è un metodo equivalente in Python per eseguire un'app esterna che avrà un output di grandi dimensioni?
Sembra "grande" nel comunicare documentazione è * molto più grande * di quanto è probabile che aspettate, e certamente molto più grande del comune. Ad esempio, è possibile produrre 10 MB di testo e la maggior parte dei sistemi sarebbe in grado di comunicare. L'output di 1 GB quando hai solo 1 GB di RAM sarebbe un'altra storia. –