2010-04-01 20 views

Respuesta

7

Use subprocess.call(). A partir de los documentos:

subprocess.call (* popenargs, ** kwargs)
comando Ejecutar con argumentos. Espere a que se complete el comando, luego devuelva el atributo de código de retorno. Los argumentos son los mismos que para el constructor Popen .

Editar:

subprocess.call() utiliza wait(), y wait() es vulnerable a bloqueos (como Tommy Herbert señaló). A partir de los documentos:

Advertencia: Este será un punto muerto si el proceso niño genera una salida suficiente a una tubería de salida estándar o stderr tal que lo bloquea en espera de la tubería OS buffer para aceptar más datos. Use communica() para evitar eso.

Así que si su comando genera una gran cantidad de salida, utilice communicate() lugar:

p = subprocess.Popen(
    ["scanx", "--udp", host], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE) 
out, err = p.communicate() 
+0

A diferencia de poll(), hay un peligro de estancamiento aquí. –

+0

@Tommy, buen punto. Ampliado en esto en mi respuesta. Gracias. –

+0

Muchas gracias muchachos :) –

7

Si no necesita una salida a todo lo que puede pasar a devnull stdout y stderr. No sé si esto puede marcar la diferencia, pero pasar un bufsize. Usando devnull ahora subprocess.call no sufre de estancamiento más

import os 
import subprocess 

null = open(os.devnull, 'w') 
subprocess.call(['ls', '-lR'], bufsize=4096, stdout=null, stderr=null) 
+0

En mi caso, "bufsize = x" no resolvió mi problema si todavía estaba usando "stdout = subprocess.Pipe". Pero el "stdout = null" funcionó bien. Sin embargo, python ya le permite usar "stdout = None" que puede reemplazar su variable nula que es un poco inútil aquí. ;) – ForceMagic

+0

No es lo mismo, "... Con Ninguno, no se producirá una redirección, los archivos del elemento secundario se heredarán del elemento principal ..." insinuando el ejemplo, está redirigiendo todo el resultado a un dispositivo nulo. –

Cuestiones relacionadas