【问题标题】:Start a subprocess, which is a new windows console in which an exe is started启动一个子进程,这是一个新的 Windows 控制台,其中启动了一个 exe
【发布时间】:2014-12-09 06:03:54
【问题描述】:

我不知道我打算做的事情是否可能或合理,所以我愿意接受任何建议。

目前我有一个脚本,它启动 some.exe idn 个子进程,我经常 poll() 确定它们是否终止,如果是,则以哪个错误级别终止。子进程保存在字典中(键 = 子进程,值 = id)。 nsome.exe 实例保持运行,每个实例都有自己的 id,直到预定义列表的每个 id 都已处理完毕。

some.exe 上没有 gui,它将进度写入标准输出,我不需要。现在,由于某种原因,some.exe 有时不会继续,就好像它会等待一样 - 因此poll() 永远不会产生错误级别,done = proc.poll() is not None 永远不会是真的。迟早会导致我对 n procs 的判断,所有这些都处于非活动状态并且整体进度被卡住了。

如果在 cmd 中手动发出,some.exe 带有一个 id,它会在脚本中显示这种行为 - 工作得很好。

因此我的想法是从脚本中启动一个新的 cmd 窗口,该窗口使用 id 运行 some.exe,但我应该仍然能够poll() 说 exe。

这是大致到目前为止我所拥有的:

while id_list > 0:
    if len(proc_dict) < n:
        id = next_id()
        proc = subprocess.Popen(["some.exe", id], stdout=PIPE)
        proc.poll()
        proc_dict[proc] = id
    else:
        done_procs = []
        for proc in proc_dict.keys():
            done = proc.poll() is not None

            if done:
                print("returncode: "+proc.returncode)
                done_procs.append(proc)

        if done_procs:
            for p in done_procs:
                del proc_dict[p]

        time.sleep(2)

编辑:如果我在sleep 所在的else:proc.communicate()[0]some.exe 能够继续/完成,但是当communicate 等待进程时,它会拖慢脚本的速度。

【问题讨论】:

  • some.exe 是否有大量输出到标准输出?
  • 我会这么说.. 输出各不相同,但大约 20-100 行或更多。
  • stdout=PIPE拿出来还有问题吗?
  • 我刚刚对其进行了测试,似乎没有stdout=PIPE..!我在那里达到了一些限制吗?非常感谢!还有其他方法可以抑制标准输出吗?

标签: python windows command-line subprocess return-code


【解决方案1】:

我认为问题在于some.exe的输出足以填满os管道缓冲区,导致死锁。文档中对此有警告here

如果您想丢弃标准输出,而不是将其发送到管道,您可以将其发送到devnullthis post 解释了如何做到这一点

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多