Tengo un código Python que ejecuta una aplicación externa que funciona bien cuando la aplicación tiene una pequeña cantidad de salida, pero se cuelga cuando hay mucho. Mi código se parece a:Usando subproceso.Popen para proceso con salida grande
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))
Hay comentarios en los documentos que parecen indicar el posible problema. Bajo espera, hay:
Advertencia: Este será un punto muerto si el proceso hijo genera suficiente salida a un tubo de
stdout
ostderr
tal que bloquea la espera de la memoria intermedia de la tubería del sistema operativo para aceptar más datos. Usecommunicate()
para evitar eso.
aunque bajo comunicarse, veo:
Nota leer los datos se almacena temporalmente en la memoria, por lo que no utilizan este método si el tamaño de los datos es grande o ilimitado.
Así que no está claro para mí que debería usar cualquiera de estos si tengo una gran cantidad de datos. No indican qué método debo usar en ese caso.
Necesito el valor de retorno del ejecutivo y realizo el análisis y uso el stdout
y el stderr
.
Entonces, ¿cuál es un método equivalente en Python para ejecutar una aplicación externa que va a tener un gran rendimiento?
Parece "grande" en el comunican documentación es * mucho más grande * que es probable que esté esperando, y ciertamente mucho más grande que lo común. Por ejemplo, puede generar 10 MB de texto y la mayoría de los sistemas estarían bien para comunicarse. La salida de 1GB cuando solo tienes 1GB de RAM sería otra historia. –