如果我将代码文件另存为.pyw
,则不会出现控制台窗口 - 这是我想要的 - 但如果代码包含对 的调用os.system
,我仍然会得到一个讨厌的控制台窗口。我认为这是由对os.system
. 有没有办法从我的.pyw
脚本中执行其他文件而根本不提升控制台窗口?
6 回答
您应该使用subprocess.Popen
类传递作为具有属性持有标志和属性持有标志startupinfo
的类的参数值实例。这可以从源代码的第866-868行中推断出来。当您在不打开控制台的情况下运行时,可能还需要将标志作为参数值传递。subprocess.STARTUPINFO
dwFlags
subprocess.STARTF_USESHOWWINDOW
wShowWindow
subprocess.SW_HIDE
subprocess.py
subprocess.CREATE_NEW_CONSOLE
creationflags
pythonw.exe
当你使用shell=True
它时,上面所有的设置都正确,但这并不意味着它是一个正确的解决方案。我认为这不是因为它增加了运行命令解释器和解析参数的开销。此外,您应该记住(...) 在根据 subprocess 模块的文档从外部输入构造命令字符串的情况下,强烈建议不要使用 shell=True 。
Piotr 描述的解决方案实际上并不像听起来那么复杂。这是一个将 astartupinfo
传递给check_call
调用以抑制控制台窗口的示例:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
由于便利函数call
, check_call
, 并将check_output
它们转发**kwargs
给Popen
构造函数,因此不需要Popen
直接使用。
人们有点懒惰......我会感谢@Piotr Dobrogost和@Frank S. Thomas的回答。
我附带了在 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)
谢谢大家 ;)
另外:请注意,以下使用“调用”的代码也适用于 Python 2.7(在 Windows 上)以及上面的“启动信息”代码:
def run_command(cmd, sin, sout):
print "Running cmd : %s"%(" ".join(cmd) )
return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)
如果您想避免启动控制台窗口,您可以尝试使用带有参数的子进程模块(或其他) 。subprocess.Popen
subprocess.call
shell=True
'os.popen' 似乎不会产生控制台窗口。脚本在“pythonw”下运行。不确定所有情况,但就我而言,它运作良好。
os.popen(command)
与@firsthand所说的类似,我在 wxPython-user 论坛上读到您“替换”当前正在运行的应用程序,即“command.com”或“CMD.exe”,用 pyw.exe 或 pythonw.exe当您使用以下内容时:
os.execl(sys.executable, *([sys.executable]+sys.argv))
虽然我不知道在这种情况下你将如何管道 io。
我相信这种方法的一个好处是,如果你多次运行你的脚本,你的操作系统任务栏不会填满 CMD 图标。另一种方法是,如果您在任务栏中最小化了几个 CMD 并开始关闭它们,则无法分辨哪个 CMD 与哪个 pythonw 脚本一起使用。