带有隐藏窗口的跨平台子进程

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,您还需要将startupinfowShowWindow 成员初始化为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

以上是关于带有隐藏窗口的跨平台子进程的主要内容,如果未能解决你的问题,请参考以下文章

golang 热重启

Linux学习-进程管理

Shell脚本入门 07:进程与信号

Shell脚本入门 07:进程与信号

关于wait 和 exit

38父进程子进程进程组作业和会话