【问题标题】:Python Popen wait/poll blocking executionPython Popen 等待/轮询阻塞执行
【发布时间】:2019-05-08 05:20:16
【问题描述】:

我需要执行一个带有参数的 exe 文件,该文件读取一个文件,进行一些计算并生成 3 个新文件。使用 subprocess.Popen 工作正常。但为了检查它的执行情况,我使用了wait()。但是当使用wait() 时,该过程不起作用并且不会生成任何文件。我什至检查了任务管理器。该过程通常需要 5 秒才能完成,但如果使用wait(),则该过程在一秒钟内结束。谁能帮帮我?

process = subprocess.Popen(span_command, shell=True)

上面的 sn-p 单独使用时可以正常工作,但如果与process.wait() 一起使用,则进程停止。

【问题讨论】:

  • 你检查process.returncode了吗?
  • @Frane 它返回无,但我的文件正在生成。如果我使用process.communicate(),则执行停止并且不会生成任何文件。
  • returncode == None 表示进程未完成。您可能在没有process.wait() 的情况下检查了它。直接在 shell 中运行 span_command 会发生什么?它是否曾经完成或正在等待一些输入?为什么你使用shell=True 大部分是不需要的?
  • @dbamistry:这似乎不可能出错; all wait does on Windows is call WaitForSingleObject on the process handle,然后一旦返回(表示进程退出),它会调用GetExitCodeProcess 来填充returnvalue。在一般情况下,任何人都不应该导致过程表现不同。您将需要提供有关您的代码及其尝试运行的程序的更多信息,因为这应该在正常条件下正常工作。
  • 鉴于WaitForSingleObject 是Windows 等待进程退出的标准方法(他们的example code for creating/waiting on processes uses it),这应该只能在正常情况下工作。 There are some potential deadlocks in a GUI program from using it,但症状会是死锁,而不是提前退出,并且您没有表明您的脚本是基于 GUI 的。

标签: python python-3.x subprocess popen


【解决方案1】:

需要更多关于执行程序的信息。

我认为您的程序在 stdin 关闭时结束。

例如,Windows 上的date 需要输入并在收到一些输入时结束。

p2 = subprocess.Popen(["date"], stdout=subprocess.PIPE ,shell=True)
print(p2.returncode)
time.sleep(10)
print(p2.returncode)
print(p2.wait())
print(p2.returncode)

这可能是您的解决方案。稍等片刻再致电wait

但最好知道该程序如何对不同的输入做出反应并使用stdin=subprocess.PIPEp2.communicate("some expected input") 运行。

检查您正在运行的程序的输出。

p2 = subprocess.Popen(["date"], stdout=subprocess.PIPE, stderr=subprocess.PIPE ,shell=True)
print(p2.wait())
print(p2.stdout.readlines())
print(p2.stderr.readlines())

这不是解决方案,这是调试过程。

没有理由不使用您提供的代码。 所以这是你没有向我们展示的东西。第一个嫌疑人是你正在运行的程序。

【讨论】:

  • 我已经尝试使用上述所有这些。 time.sleep(10) 导致进程从任务管理器结束,我没有得到想要的输出。我的程序需要在span_command 本身中传递的文件路径来执行。直接从命令行执行时,整个 span_command 工作正常。问题是子进程启动后,如果在此之后编写任何代码,子进程就会停止并且代码会进一步执行。只有印刷作品。使用exec() 函数在 PHP 中运行相同的程序。
  • 你尝试过其他程序吗?您也可以尝试查看stdout=subprocess.PIPEstderr=subprocess.PIPE
  • @dbamistry stdout 和 stderr 可能会为您提供更多错误信息。这不是解决方案,而是调试过程。没有理由不使用您提供的代码。所以这是你没有向我们展示的东西。第一个嫌疑人是你正在运行的程序。
  • proc.wait() 正在返回 0。stdout 正在返回 <_io.BufferedReader name=6>stderr <_io.BufferedReader name=7>。该软件是一个基于 GUI 的软件,它以文件为输入并生成少量文件。我们也可以从 CMD 访问它,并且语法在 CMD 中运行良好。
  • stderr.readlines() 为空。我相信没有错误。 stdout.readlines() 是来自输入文件的数据。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2011-01-07
  • 2015-09-26
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多