2009-11-28 15 views
12

Tengo un programa con una interfaz gráfica de usuario que se ejecuta un programa externo a través de una llamada Popen:Ejecución de un proceso en el pythonw con Popen sin una consola

p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd()) 
p.communicate() 

Pero una consola aparece, independientemente de lo que hago (I También he intentado pasarlo NUL para el manejador de archivo). ¿Hay alguna manera de hacerlo sin obtener el binario que llamo para liberar su consola?

+0

Son estos comandos que normalmente se ejecutan en una consola? ¿Estás tratando de ejecutar otro programa GUI que no tiene una consola? –

Respuesta

24

De here:

import subprocess 

def launchWithoutConsole(command, args): 
    """Launches 'command' windowless and waits until finished""" 
    startupinfo = subprocess.STARTUPINFO() 
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
    return subprocess.Popen([command] + args, startupinfo=startupinfo).wait() 

if __name__ == "__main__": 
    # test with "pythonw.exe" 
    launchWithoutConsole("d:\\bin\\gzip.exe", ["-d", "myfile.gz"]) 
+0

Aha! Gracias. Ni siquiera noté esa opción allí ... – sbirch

2

es posible que pueda hacer sólo subprocess.Popen([command], shell=False).

Eso es lo que uso de todos modos. Le ahorra todas las tonterías de configurar banderas y todo eso. Una vez nombrado como .pyw o ejecutado con pythonw, no debería abrir una consola.

+0

shell = False ya es el predeterminado, por lo que no veo lo que esto va a solucionar: https://docs.python.org/2/library/subprocess .html # subprocess.Popen – totaam

+1

'shell = False' no cambiará nada, la solución es usar' shell = True' con un archivo '.pyw'. – ZeroFunter

1

Eso sí, subprocess.Popen([command], shell=True)

+0

¿Qué archivo 'pyw'? Él necesita ejecutar una aplicación externa. –

+0

Esto funciona como un encanto. No necesita un archivo '.pyw'. – vy32

0

Esto funciona muy bien en el win32api. Las otras soluciones no me funcionaban.

import win32api 
chrome = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"" 
args = "https://stackoverflow.com" 

win32api.WinExec(chrome + " " + args) 
Cuestiones relacionadas