我有一个带GUI的程序,通过Popen调用运行外部程序:
p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()
但无论我做什么(我还尝试传递NUL作为文件句柄),都会弹出控制台。有没有办法在不让我调用的二进制文件释放控制台的情况下实现这一点?
我有一个带GUI的程序,通过Popen调用运行外部程序:
p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()
但无论我做什么(我还尝试传递NUL作为文件句柄),都会弹出控制台。有没有办法在不让我调用的二进制文件释放控制台的情况下实现这一点?
来自 这里:
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"])
请注意,有时禁止控制台会导致子进程调用失败并显示"Error 6: invalid handle"。一个快速解决方法是重定向stdin
,具体操作可以参考这里:Python running as Windows Service: OSError: [WinError 6] The handle is invalid
startupinfo.wShowWindow = subprocess.SW_HIDE
是_隐含的_(SW_HIDE
(0
)是默认值)。 - mklement0只需执行 subprocess.Popen([command], shell=True)
pyw
文件?他需要运行一个外部应用程序。 - David Ferenczy Rogožan.pyw
文件。 - vy32creationflags
来影响Popen
创建进程的方式。特别地,CREATE_NO_WINDOW
标志对您很有用。variable = subprocess.Popen(
"CMD COMMAND",
stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
)
import win32api
chrome = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\""
args = "https://stackoverflow.com"
win32api.WinExec(chrome + " " + args)
可在 Windows 11 上运行
result = subprocess.run(['nslookup', '2.16.206.132'], shell=True, capture_output=True, text=True)
print(result.stdout)
该进程在不打开shell控制台的情况下执行。 这比使用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运行,它就不应该打开控制台。
shell = False
不会改变任何东西,解决方法是使用带有.pyw
文件的shell = True
。 - notTypecast