Запуск процесса в pythonw с помощью Popen без консоли - PullRequest
16 голосов
/ 29 ноября 2009

У меня есть программа с графическим интерфейсом, которая запускает внешнюю программу через вызов Popen:

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

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

Ответы [ 5 ]

28 голосов
/ 29 ноября 2009

С здесь :

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"])
1 голос
/ 03 июля 2017

Это хорошо работает в win32api. Другие решения не работали для меня.

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

win32api.WinExec(chrome + " " + args)
1 голос
/ 15 апреля 2017

просто сделай subprocess.Popen([command], shell=True)

0 голосов
/ 26 ноября 2018

Согласно документации Python 2.7 и Документация Python 3.7 , вы можете влиять на то, как Popen создает процесс, установив creationflags. В частности, вам будет полезен флаг CREATE_NO_WINDOW.

variable = subprocess.Popen(
   "CMD COMMAND", 
   stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
)
0 голосов
/ 29 ноября 2009

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

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

...