¿Cuál es la diferencia si no uso stdout = subprocess.PIPE en subprocess.Popen ()?

Recientemente noté en Python que el subprocess.Popen() tiene un argumento:

 stdout=None(default) 

También vi a gente usando stdout = subprocess.PIPE.

¿Cuál es la diferencia? ¿Cuál debo usar?

Otra pregunta sería, ¿por qué la función de espera () no puede esperar hasta que el proceso se realice realmente a veces? Solía:

 a = sp.Popen(....,shell=True) a.wait() a2 = sp.Popen(...,shell=True) a2.wait() 

a veces, el comando a2 se ejecuta antes de que se ejecute el comando a.

stdout=None significa que el stdout -handle del proceso se hereda directamente del padre; en palabras más sencillas, básicamente significa que se imprime en la consola (lo mismo se aplica a stderr ).

Luego tiene la opción stderr=STDOUT , esto redirige stderr a stdout , lo que significa que la salida de stdout y stderr se reenvían al mismo identificador de archivo.

Si configura stdout=PIPE , Python redirigirá los datos del proceso a un nuevo identificador de archivo, al que se puede acceder a través de p.stdout ( p Popen ., Popen objeto Popen ). Usaría esto para capturar la salida del proceso, o para el caso de la stdin para enviar datos (constantemente) a la stdin . Pero principalmente desea usar p.communicate , que le permite enviar datos al proceso una vez (si es necesario) y devuelve el stderr completo y la stderr stdout si el proceso se completa.

Un hecho más interesante, puede pasar cualquier file-object a stdin/stderr/stdout , por ejemplo, también un archivo abierto con open (el objeto debe proporcionar un método fileno() ).

A tu problema de wait . ¡Éste no debería ser el caso! Como solución alternativa, ¡podría usar p.poll() para verificar si el proceso se p.poll() ! ¿Cuál es el valor de retorno de la llamada en wait ?

Además, debes evitar el shell=True especialmente si pasas la entrada del usuario como primer argumento , ¡este podría ser usado por un usuario malintencionado para explotar tu progtwig! También lanza un proceso de shell que significa sobrecarga adicional. Por supuesto, hay un 1% de casos en los que realmente necesita shell=True , no puedo juzgar esto con su ejemplo minimalista.

  • stdout=None significa que el subproceso se imprime en el lugar que imprima el script
  • stdout=PIPE significa que la salida estándar del subproceso se redirige a una canalización que debería leer, por ejemplo, usando process.communicate() para leer todo de una vez o usando process.stdout object para leer a través de un archivo / interfaces iterador