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

如果我保存我的代码文件为.pyw ,则不会出现控制台窗口 – 这是我想要的 – 但是如果代码包含对os.system的调用,我仍然会得到一个烦人的控制台窗口。 我认为这是由os.system调用引起的。 有没有办法从我的.pyw脚本内执行其他文件,而根本没有提高控制台窗口?

Solutions Collecting From Web of "如何避免包含os.system调用.pyw文件的控制台窗口?"

如果你想避免启动一个控制台窗口,你可以尝试使用参数shell=True的子进程模块( subprocess.Popensubprocess.call或其他)。

您应该使用subprocess.Popen类作为startupinfo参数的subprocess.STARTF_USESHOWWINDOW wShowWindow的值实例传递wShowWindow类具有保持subprocess.STARTF_USESHOWWINDOW wShowWindow dwFlags属性wShowWindow标志和wShowWindow属性包含subprocess.SW_HIDE wShowWindow标志。 这可以通过阅读subprocess.py源代码的866-868行来推断。 在不打开控制台的情况下运行pythonw.exe ,可能还需要传递subprocess.CREATE_NEW_CONSOLE标志作为creationflags参数的值。

当你使用shell=True ,只会发生上面所有的设置都正确,但这并不意味着这是一个合适的解决方案。 我认为这不是因为它增加了运行命令解释器和解析参数的开销。 另外,请注意,根据子进程模块的文档, 在外部输入构造命令字符串的情况下, 强烈建议不要使用(…)shell = True

Piotr描述的解决方案实际上并不像听起来那么复杂。 下面是一个启动信息被传递给check_call调用以禁止控制台窗口的例子:

 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.check_call(cmd, startupinfo=startupinfo) 

由于便利函数callcheck_callcheck_output将它们的**kwargs转发给check_output构造函数,所以不需要直接使用Popen

人们有点懒惰…我会thx @Piotr Dobrogost@Frank S.托马斯他们的答案。

我来到这个在Linux和Windows上运行的代码:

 import platform import subprocess startupinfo = None if platform.system() == 'Windows': import _subprocess # @bug with python 2.7 ? startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _subprocess.SW_HIDE 

后来…

 args = [exe, ...] out = subprocess.check_output(args, startupinfo=startupinfo) 

Thx家伙;)

另外:只要注意下面的代码使用'call'也适用于Python 2.7(在Windows上),上面的'startupinfo'代码:

 def run_command(cmd, sin, sout): print "Running cmd : %s"%(" ".join(cmd) ) return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo) 

看来'os.popen'不会产生控制台窗口。 脚本在'pythonw'下运行。 不知道所有的情况下,但在我的情况下,它运作良好。

 os.popen(command) 

类似于@firsthand说的,我已经阅读了wxPython用户论坛,用pyw.exe或pythonw.exe“替换”当前运行的应用程序,即“command.com”或“CMD.exe”当你使用如下的东西时:

 os.execl(sys.executable, *([sys.executable]+sys.argv)) 

看到另一个帖子

虽然我不知道你会如何在这种情况下管理io。

我相信这种方法的一个好处是如果你多次运行你的脚本你的OS任务栏没有填充CMD图标。 另一种方法是,如果在任务栏中将多个CMD最小化并开始关闭它们,则不可能知道哪个CMD与哪个pythonw脚本一起使用。