【问题标题】:Using subprocess to find out when a process ends使用子进程找出进程何时结束
【发布时间】:2010-07-07 15:56:23
【问题描述】:

我希望按顺序运行一些派生自己进程的 c 脚本(在新的命令行窗口中),并在它们完成时提供"Press any key to continue..."。从技术上讲,它是一个特殊的编译器。它弹出一个命令行窗口并告诉我编译是否成功。但是那个命令行窗口会派生新的进程来编译,这会在它应该之前返回 0..

我的第一次尝试是

    process = subprocess.Popen(cmd)
    process.wait()

在遍历每个文件时。不幸的是,这并没有等待“按任意键继续......”并在我的脸上炸毁。似乎wait() 调用是在内部进程完成时传递的(我无权访问)。

我怎样才能改为等待“按任意键继续...”?在按任意键继续行之前,它还会打印一些其他信息..

目前,这是我的代码:

            process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
            completed = False
            while not completed:
                if process.poll() is not None:
                    completed = True

            print "communicating"
            process.communicate("k")
            print "communicated"

【问题讨论】:

  • 新代码是荒谬的:您正忙于等待进程终止(wait() 也会这样做,只是不会使您的 CPU 过热),然后尝试与死进程通信!如果您正在启动的脚本在后台创建了一个新进程,然后立即返回,那么您无能为力。您必须获取孙进程的 pid,然后对其执行 os.wait()。

标签: python windows process build-automation fork


【解决方案1】:

您可以使用subprocess.poll 不阻塞地检查状态,使用subprocess.communicate 向子进程发送信息。

【讨论】:

  • 如果它给我“按任意键继续...”我认为它还没有返回任何值吗?这不会使 subprocess.poll 变得无用吗?
  • 是的,这似乎并没有等待它打印“按任意键继续...”
  • 尝试只使用通信 - 当然这假设 stdoutstdin 已绑定到 subprocess.PIPE,因此您需要将其更改为 .Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
  • 我已经用我所拥有的更新了这个问题。它似乎锁定在通信()命令。我也尝试过没有参数来尝试从中获取标准输出,但没有骰子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多