如何避免包含os.system调用的.pyw文件打开控制台窗口?
如果我把我的代码文件保存为 .pyw
格式,就不会出现控制台窗口,这正是我想要的。但是如果代码里有调用 os.system
的话,还是会弹出一个烦人的控制台窗口。我猜这可能是因为调用了 os.system
。有没有办法在我的 .pyw
脚本里执行其他文件,而完全不弹出控制台窗口呢?
6 个回答
Piotr所描述的解决方案其实并没有听起来那么复杂。这里有一个例子,展示了如何在调用check_call
时传递一个startupinfo
,这样可以隐藏控制台窗口:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
因为方便的函数call
、check_call
和check_output
会把它们的**kwargs
传递给Popen
的构造函数,所以其实不需要直接使用Popen
。
你应该使用 subprocess.Popen
这个类,并在里面传入一个 startupinfo
参数,这个参数的值是 subprocess.STARTUPINFO
类的一个实例。这个实例需要有一个叫 dwFlags
的属性,里面要设置 subprocess.STARTF_USESHOWWINDOW
的标志;还有一个叫 wShowWindow
的属性,里面要设置 subprocess.SW_HIDE
的标志。你可以通过查看 subprocess.py
源代码的第 866-868 行来理解这些内容。如果你是在 pythonw.exe
下运行,这个程序不会打开控制台,可能还需要把 subprocess.CREATE_NEW_CONSOLE
的标志作为 creationflags
参数的值传入。
当你使用 shell=True
时,以上所有设置都可能会正确,但这并不意味着这是一个合适的解决方案。我认为这并不好,因为它会增加运行命令解释器和解析参数的开销。此外,你还应该记住,根据子进程模块的文档,(...) 在命令字符串是从外部输入构建的情况下,使用 shell=True
是 强烈不推荐 的。
如果你想避免打开一个控制台窗口,可以试试使用 subprocess 模块里的一些方法,比如 subprocess.Popen
或 subprocess.call
,并且在调用时加上参数 shell=True
。