跨平台的子进程并隐藏窗口

38

我想要在后台打开一个进程并与之交互,但是这个进程在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)    
4个回答

40

你可以简化一行代码 :)

startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)

啊哈。我曾尝试过startupinfo = '',但它没有起作用。这就是我一直在寻找的答案。 - endolith
1
我刚刚查看了子进程代码,以了解他们如何生成该错误消息,并检查startupinfo是否为None,这在Python中应该是这样的。 - Anurag Uniyal
3
如果你设置了 STARTF_SHOWWINDOW,那么你也需要初始化 startupinfowShowWindow 成员为 SW_* 常数中的一个。该方法依赖于运行的程序实际上对 wShowWindow 标志执行操作;但并非必须这样做。 - Greg Hewgill

12

仅仅一个提示:对于Python 2.7我必须使用subprocess._subprocess.STARTF_USESHOWWINDOW而不是subprocess.STARTF_USESHOWWINDOW


相关的Python问题9861:子进程模块更改了公开属性 - Piotr Dobrogost
1
它是Python 2.7的哪个版本?根据https://code.google.com/p/googleappengine/issues/detail?id=10363#c2,*`subprocess.STARTF_USESHOWWINDOW`在Python 2.7.2之后添加。 - Piotr Dobrogost

4

我不确定你能做得比现在更简单了。你谈论的是优化掉可能只有5行代码。对于这些钱,我会继续我的项目,并将其视为跨平台开发的结果。如果你经常这样做,那么可以创建一个专门的类或函数来封装逻辑并进行导入。


1

你可以将你的代码转换为:

params = dict()

if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    params['startupinfo'] = startupinfo

proc = subprocess.Popen(command, **params)

但这并没有好多少。


2
在所有系统上,Popen都接受startupinfo参数,但在posix上,它应该为None。 - Anurag Uniyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接