如何避免包含os.system调用的.pyw文件打开控制台窗口?

14 投票
6 回答
10792 浏览
提问于 2025-04-15 16:10

如果我把我的代码文件保存为 .pyw 格式,就不会出现控制台窗口,这正是我想要的。但是如果代码里有调用 os.system 的话,还是会弹出一个烦人的控制台窗口。我猜这可能是因为调用了 os.system。有没有办法在我的 .pyw 脚本里执行其他文件,而完全不弹出控制台窗口呢?

6 个回答

17

Piotr所描述的解决方案其实并没有听起来那么复杂。这里有一个例子,展示了如何在调用check_call时传递一个startupinfo,这样可以隐藏控制台窗口:

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

subprocess.check_call(cmd, startupinfo=startupinfo)

因为方便的函数callcheck_callcheck_output会把它们的**kwargs传递给Popen的构造函数,所以其实不需要直接使用Popen

17

你应该使用 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强烈不推荐

6

如果你想避免打开一个控制台窗口,可以试试使用 subprocess 模块里的一些方法,比如 subprocess.Popensubprocess.call,并且在调用时加上参数 shell=True

撰写回答