Запуск процесса в pythonw с помощью Popen без консоли
У меня есть программа с графическим интерфейсом, которая запускает внешнюю программу через вызов Popen:
p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()
Но появляется консоль, независимо от того, что я делаю (я также пытался передать ее NUL для дескриптора файла). Есть ли способ сделать это без получения двоичного файла, который я вызываю, чтобы освободить его консоль?
6 ответов
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"])
Согласно документации Python 2.7 и документации Python 3.7, вы можете влиять на то, как Popen
создает процесс путем установки creationflags
, В частности, CREATE_NO_WINDOW
Флаг был бы полезен для вас.
variable = subprocess.Popen(
"CMD COMMAND",
stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
)
Это хорошо работает в win32api. Другие решения не работали для меня.
import win32api
chrome = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\""
args = "https://stackru.com"
win32api.WinExec(chrome + " " + args)
Оболочка атрибута «подпроцесс» Python = True
работает в окне 11
result = subprocess.run(['nslookup', '2.16.206.132'], shell=True, capture_output=True, text=True)
print(result.stdout)
Процесс выполняется без открытия оболочки-консоли. Это работает намного быстрее, как с shell=False ... :)
Результат здесь:
Server: OpenWrt.lan
Address: 192.168.1.1
Name: a2-16-206-132.deploy.static.akamaitechnologies.com
Address: 2.16.206.132
Вы могли бы просто сделать subprocess.Popen([command], shell=False)
,
Это то, что я использую в любом случае. Спасает вас всю глупость установки флагов и еще много чего. Однажды названная как.pyw или запущенная с pythonw, она не должна открывать консоль.