带有隐藏窗口的跨平台子进程
Posted
技术标签:
【中文标题】带有隐藏窗口的跨平台子进程【英文标题】:Cross-platform subprocess with hidden window 【发布时间】:2010-11-04 05:19:26 【问题描述】:我想在后台打开一个进程并与之交互,但是这个进程在Linux和Windows中都应该是不可见的。在 Windows 中,您必须使用 STARTUPINFO 做一些事情,而这在 Linux 中无效:
ValueError: startupinfo 仅在 Windows 平台上受支持
有没有比为每个操作系统创建单独的 Popen 命令更简单的方法?
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
if os.name == 'posix':
proc = subprocess.Popen(command)
【问题讨论】:
【参考方案1】:你可以减少一行:)
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
【讨论】:
啊哈。我试过 startupinfo = '' 但没有用。这就是我一直在寻找的答案。 我只是查看了子进程代码以查看它们如何生成该错误消息,并检查 startupinfo 是否不为 None,就像在 python 中那样 如果您设置了STARTF_SHOWWINDOW
,您还需要将startupinfo
的wShowWindow
成员初始化为SW_*
常量之一。此方法依赖于您运行的程序实际作用于wShowWindow
标志;不需要这样做。【参考方案2】:
请注意:对于 Python 2.7,我必须使用 subprocess._subprocess.STARTF_USESHOWWINDOW
而不是 subprocess.STARTF_USESHOWWINDOW
。
【讨论】:
谢谢,这正是我需要的提示。 相关 Python 问题 9861:subprocess module changed exposed attributes 它是什么版本的 Python 2.7?根据code.google.com/p/googleappengine/issues/detail?id=10363#c2subprocess.STARTF_USESHOWWINDOW
是在Python 2.7.2之后添加的。【参考方案3】:
我不确定您是否可以比您所做的更简单。您正在谈论优化可能 5 行代码。为了钱,我会继续我的项目,并接受这是跨平台开发的结果。如果你经常这样做,那么创建一个专门的类或函数来封装逻辑并导入它。
【讨论】:
【参考方案4】:你可以把你的代码变成:
params = dict()
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
params['startupinfo'] = startupinfo
proc = subprocess.Popen(command, **params)
但这也好不了多少。
【讨论】:
不需要在所有系统上创建参数 Popen 接受参数 startupinfo 但在 posix 上它应该是 None以上是关于带有隐藏窗口的跨平台子进程的主要内容,如果未能解决你的问题,请参考以下文章