Python,Popen 和 select - 等待进程终止或超时

标签 python select timeout subprocess popen

我使用以下方式运行子进程:

  p = subprocess.Popen("subprocess", 
                       stdout=subprocess.PIPE, 
                       stderr=subprocess.PIPE, 
                       stdin=subprocess.PIPE)

此子进程可以在 stderr 上出现错误时立即退出,或者继续运行。我想检测其中任何一种情况 - 后者需要等待几秒钟。

我试过了:

  SECONDS_TO_WAIT = 10
  select.select([], 
                [p.stdout, p.stderr], 
                [p.stdout, p.stderr],
                SECONDS_TO_WAIT)

但它只是返回:

  ([],[],[])

在任何一种情况下。我能做什么?

最佳答案

您是否尝试过使用 Popen.Poll() 方法。你可以这样做:

p = subprocess.Popen("subprocess", 
                   stdout=subprocess.PIPE, 
                   stderr=subprocess.PIPE, 
                   stdin=subprocess.PIPE)

time.sleep(SECONDS_TO_WAIT)
retcode = p.poll()
if retcode is not None:
   # process has terminated

这将导致您始终等待 10 秒,但如果失败案例很少见,这将在所有成功案例中摊销。


编辑:

怎么样:

t_nought = time.time()
seconds_passed = 0

while(p.poll() is not None and seconds_passed < 10):
    seconds_passed = time.time() - t_nought

if seconds_passed >= 10:
   #TIMED OUT

这有一个忙着等待的丑陋,但我认为它完成了你想要的。

另外再看一下选择调用文档,我想你可能想按如下方式进行更改:

SECONDS_TO_WAIT = 10
  select.select([p.stderr], 
                [], 
                [p.stdout, p.stderr],
                SECONDS_TO_WAIT)

由于您通常希望从 stderr 中读取数据,因此您想知道它何时有可读取的内容(即失败案例)。

我希望这会有所帮助。

关于Python,Popen 和 select - 等待进程终止或超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/337863/

相关文章:

mysql - SELECT DISTINCT 值 - 相同 ID 的多行 - 多个条件

python - 如何使用 pyplot 正确显示图像的红色、绿色和蓝色 (rgb) channel

Python:线程是否仍在运行

php - 对非对象调用函数查询

SQL 在 WHERE IN 子句中使用 CASE 语句

java - 如何在 Java servlet 容器上指定 Http Request 超时参数

Java Telegram API RpcCall 超时

.net - 使用 Visual Studio 2017 构建 Docker 失败,因为在使用私有(private) nuget 源的 dotnet 还原期间超时

python - 如何在条形图(Python)的条形图上方写文字?

python - 在另一个函数中调用一个函数的结果