【问题标题】: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)    

【问题讨论】:

    标签: python windows linux cross-platform subprocess


    【解决方案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

    【讨论】:

    【解决方案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
      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多