2009-06-19 10 views
28

Quiero abrir un proceso en segundo plano e interactuar con él, pero este proceso debería ser invisible tanto en Linux como en Windows. En Windows hay que hacer algunas cosas con STARTUPINFO, mientras que esto no es válido en Linux:Subproceso multiplataforma con ventana oculta

ValueError: startupinfo is only supported on Windows platforms

¿Existe una manera más sencilla de crear un comando separado Popen para cada sistema operativo?

if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    proc = subprocess.Popen(command, startupinfo=startupinfo) 
if os.name == 'posix': 
    proc = subprocess.Popen(command)  

Respuesta

31

Puede reducir una línea :)

startupinfo = None 
if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
proc = subprocess.Popen(command, startupinfo=startupinfo) 
+0

Aha. Intenté startupinfo = '' y no funcionó. Esta es la respuesta que estaba buscando. – endolith

+1

Acabo de mirar a través del código de subproceso para ver cómo generan ese mensaje de error y comprueban si startupinfo no es None, como debería ser en python –

+3

Si configura 'STARTF_SHOWWINDOW', también querrá inicializar el miembro' wShowWindow' de 'startupinfo' a una de las constantes' SW_ * '. Este método se basa en el programa que ejecuta realmente actuando sobre el indicador 'wShowWindow'; no es obligatorio hacerlo. –

3

no estoy seguro de que usted puede conseguir mucho más simple que lo que has hecho. Estás hablando de optimizar quizás 5 líneas de código. Por el dinero, me gustaría seguir con mi proyecto y aceptar esto como una consecuencia del desarrollo multiplataforma. Si lo haces mucho, crea una clase o función especializada para encapsular la lógica e importarla.

1

puede convertir su código en:

params = dict() 

if os.name == 'nt': 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    params['startupinfo'] = startupinfo 

proc = subprocess.Popen(command, **params) 

pero eso no es mucho mejor.

+2

sin necesidad de crear params como en todos los sistemas Popen acepta param startupinfo pero en posix debe ser None –

12

Sólo una nota: para Python 2.7 tengo que usar en lugar de subprocess._subprocess.STARTF_USESHOWWINDOWsubprocess.STARTF_USESHOWWINDOW.

+1

Gracias, este fue exactamente el consejo que necesitaba. –

+0

Problema relacionado de Python 9861: [módulo de subproceso cambió atributos expuestos] (http://bugs.python.org/issue9861) –

+1

¿Qué versión de Python 2.7 era? Según https://code.google.com/p/googleappengine/issues/detail?id=10363#c2 * 'subprocess.STARTF_USESHOWWINDOW' se agrega después de Python 2.7.2. * –

Cuestiones relacionadas