12

如果我将代码文件另存为.pyw,则不会出现控制台窗口 - 这是我想要的 - 但如果代码包含对 的调用os.system,我仍然会得到一个讨厌的控制台窗口。我认为这是由对os.system. 有没有办法从我的.pyw脚本中执行其他文件而根本不提升控制台窗口?

4

6 回答 6

16

您应该使用subprocess.Popen类传递作为具有属性持有标志和属性持有标志startupinfo的类的参数值实例。这可以从源代码的第866-868行中推断出来。当您在不打开控制台的情况下运行时,可能还需要将标志作为参数值传递。subprocess.STARTUPINFOdwFlagssubprocess.STARTF_USESHOWWINDOWwShowWindowsubprocess.SW_HIDEsubprocess.pysubprocess.CREATE_NEW_CONSOLEcreationflagspythonw.exe

当你使用shell=True它时,上面所有的设置都正确,但这并不意味着它是一个正确的解决方案。我认为这不是因为它增加了运行命令解释器和解析参数的开销。此外,您应该记住(...) 在根据 subprocess 模块的文档从外部输入构造命令字符串的情况下,强烈建议不要使用 shell=True 。

于 2012-10-18T22:44:40.437 回答
13

Piotr 描述的解决方案实际上并不像听起来那么复杂。这是一个将 astartupinfo传递给check_call调用以抑制控制台窗口的示例:

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

subprocess.check_call(cmd, startupinfo=startupinfo)

由于便利函数call, check_call, 并将check_output它们转发**kwargsPopen构造函数,因此不需要Popen直接使用。

于 2013-04-17T10:33:53.240 回答
7

人们有点懒惰......我会感谢@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)
于 2013-10-06T03:11:04.757 回答
6

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

于 2009-11-19T17:31:08.400 回答
1

'os.popen' 似乎不会产生控制台窗口。脚本在“pythonw”下运行。不确定所有情况,但就我而言,它运作良好。

os.popen(command)
于 2013-05-27T18:12:55.313 回答
0

@firsthand所说的类似,我在 wxPython-user 论坛上读到您“替换”当前正在运行的应用程序,即“command.com”或“CMD.exe”,用 pyw.exe 或 pythonw.exe当您使用以下内容时:

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

另一个帖子

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

我相信这种方法的一个好处是,如果你多次运行你的脚本,你的操作系统任务栏不会填满 CMD 图标。另一种方法是,如果您在任务栏中最小化了几个 CMD 并开始关闭它们,则无法分辨哪个 CMD 与哪个 pythonw 脚本一起使用。

于 2014-07-17T01:55:48.927 回答