如果我将代码文件另存为.pyw,则不会出现控制台窗口 - 这是我想要的 - 但如果代码包含对 的调用os.system,我仍然会得到一个讨厌的控制台窗口。我认为这是由对os.system. 有没有办法从我的.pyw脚本中执行其他文件而根本不提升控制台窗口?
6 回答
您应该使用subprocess.Popen类传递作为具有属性持有标志和属性持有标志startupinfo的类的参数值实例。这可以从源代码的第866-868行中推断出来。当您在不打开控制台的情况下运行时,可能还需要将标志作为参数值传递。subprocess.STARTUPINFOdwFlagssubprocess.STARTF_USESHOWWINDOWwShowWindowsubprocess.SW_HIDEsubprocess.pysubprocess.CREATE_NEW_CONSOLEcreationflagspythonw.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.Popensubprocess.callshell=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 脚本一起使用。