Как скрыть консоль, когда я использую os.system () или subprocess.call ()? - PullRequest
53 голосов
/ 10 августа 2011

Я написал несколько утверждений, как показано ниже:

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')

у обоих появится консоль.

Как я могу остановить его от появления консоли?

Ответы [ 4 ]

88 голосов
/ 10 августа 2011

Процесс STARTUPINFO может скрыть окно консоли:

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow = subprocess.SW_HIDE # default
subprocess.call('taskkill /F /IM exename.exe', startupinfo=si)

Или установить флаги создания, чтобы отключить создание окна:

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)

Выше все еще процесс консолис действительными дескрипторами для консольного ввода-вывода (проверяется путем вызова GetFileType для дескрипторов, возвращаемых GetStdHandle).У него просто нет окна и он не наследует родительскую консоль, если она есть.

Вы можете пойти еще дальше, заставив ребенка вообще не иметь консоли:

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)

В этом случае стандартные ручки ребенка (т. Е. GetStdHandle) равны 0, но выможно установить для них открытый файл на диске или канал, такой как subprocess.DEVNULL (3.3) или subprocess.PIPE.

20 голосов
/ 22 сентября 2011

Добавьте аргумент shell=True к вызовам подпроцесса.

subprocess.call('taskkill /F /IM exename.exe', shell=True)

Или, если вам не нужно ждать, используйте subprocess.Popen вместо subprocess.call.

subprocess.Popen('taskkill /F /IM exename.exe', shell=True)
0 голосов
/ 03 ноября 2018

попробуйте изменить расширение с .py на .pyw

0 голосов
/ 10 августа 2011

Попробуйте subprocess.Popen(["function","option1","option2"],shell=False).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...