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

Я написал несколько заявлений, как показано ниже:

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

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

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

4 ответа

Решение

Процесс 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,

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

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

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

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

Просто добавь:subprocess.call('powershell.exe taskkill /F /IM exename.exe', shell=True)

Пытаться subprocess.Popen(["function","option1","option2"],shell=False),

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

Другие вопросы по тегам