2009-11-28 3 views
12

J'ai un programme avec une interface graphique qui exécute un programme externe par un appel Popen:Exécution d'un processus pythonw avec Popen sans console

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

Mais une console apparaît, peu importe ce que je fais (je ai également essayé de le passer NUL pour la poignée de fichier). Y at-il un moyen de le faire sans obtenir le binaire que j'appelle pour libérer sa console?

+0

Ces commandes sont-elles normalement exécutées dans une console? Essayez-vous d'exécuter un autre programme graphique qui n'a pas de console? –

Répondre

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! Merci. Je n'ai même pas remarqué cette option là ... – sbirch

2

Vous pourriez être en mesure de le faire subprocess.Popen([command], shell=False).

C'est ce que j'utilise de toute façon. Vous sauve tous les bêtises de drapeaux de réglage et autres joyeusetés. Une fois nommé comme .pyw ou exécuté avec pythonw, il ne doit pas ouvrir une console.

+0

shell = False est déjà la valeur par défaut, donc je ne vois pas ce que cela va réparer: https://docs.python.org/2/library/subprocess .html # subprocess.Popen – totaam

+1

'shell = False' ne changera rien, la solution est d'utiliser' shell = True' avec un fichier '.pyw'. – ZeroFunter

1

juste faire subprocess.Popen([command], shell=True)

+0

Quel fichier 'pyw'? Il doit exécuter une application externe. –

+0

Cela fonctionne comme un charme. Vous n'avez pas besoin d'un fichier '.pyw'. – vy32

0

Cela fonctionne bien dans le win32api. Les autres solutions ne fonctionnaient pas pour moi.

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

win32api.WinExec(chrome + " " + args) 
Questions connexes