2009-11-28 6 views
12

У меня есть программа с графическим интерфейсом, который запускает внешнюю программу с помощью вызова POPEN:Запуск процесса в pythonw с Popen без консоли

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

Но консоль выскакивает, независимо от того, что я делаю (I 've также попытался передать его NUL для дескриптора файла). Есть ли способ сделать это, не получив двоичный код, который я вызываю, чтобы освободить консоль?

+0

Эти команды обычно запускаются в консоли? Вы пытаетесь запустить еще одну программу GUI, у которой нет консоли? –

ответ

24

От 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! Благодарю. Я даже не заметил эту опцию там ... – sbirch

2

Вы могли бы просто сделать subprocess.Popen([command], shell=False).

Это то, что я использую в любом случае. Сэкономит вам всю глупость установки флагов и еще много чего. Однажды названная как .pyw или работающая с pythonw, она не должна открывать консоль.

+0

shell = False уже по умолчанию, поэтому я не вижу, что это будет исправлять: https://docs.python.org/2/library/subprocess .html # subprocess.Popen – totaam

+1

'shell = False' ничего не изменит, решение должно использовать' shell = True' с файлом '.pyw'. – ZeroFunter

1

вобще subprocess.Popen([command], shell=True)

+0

Какой файл 'pyw'? Ему нужно запустить внешнее приложение. –

+0

Это работает как шарм. Вам не нужен файл '.pyw'. – vy32

0

Это прекрасно работает в WIN32API. Другие решения не работали для меня.

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

win32api.WinExec(chrome + " " + args)