【问题标题】:How to check if not one but any Popen subprocess at all is still running?如何检查不是一个而是任何 Popen 子进程是否仍在运行?
【发布时间】:2021-12-11 23:30:47
【问题描述】:

我知道可以使用 .poll() 检查子进程是否仍在运行。比如:

p = subprocess.Popen(...
"""
A None value indicates that the process hasn't terminated yet.
"""
poll = p.poll()
if poll is None:
  # p.subprocess is alive

就我而言,我同时运行多个相同的子进程,并将它们存储在一个名为 proc 的列表中。每次我需要一个新的子流程时,我都会调用:

proc.append(subprocess.Popen([sys.executable,...

.poll() 不会获取列表值,所以有没有人可以为我提供一个工作示例,说明如何检查是否有任何子进程仍在运行,而子进程存储在列表中?

这是我目前的更新:

proc.append(subprocess.Popen([sys.executable,....


def evaluate():
    global proc
    global p
    p = []
    for t in proc:
        print(t.poll())
        if t.poll() is None:
            p.append(0)
        else:
            p.append(1)


evaluate()
if 1 in p:
    #some tasks running
else:
    #no task running

【问题讨论】:

  • 为什么不能遍历列表? for process in proc: print(process.poll())
  • 我将如何定义子进程是否仍在运行?因为定义它的变量每次都会在循环内被覆盖。
  • 您将它们保存到一个列表中,以便将参考保存在那里,您是否尝试过这样做?
  • 是的,我在过去的两个小时内尝试自己弄清楚。但是,我还没有成功。我在哪里可以发布更多代码,因为它似乎在此评论中不起作用?
  • 为什么不使用内置的any,带有生成器表达式,例如if any(t.poll() is None for t in proc): print('something is running')?

标签: python python-3.x subprocess popen sys


【解决方案1】:

按照 Matiiss 的建议,您可以遍历列表或通过索引访问列表中的项目,例如

>>> slp = []
>>> slp.append(subprocess.Popen(['sleep', '40']))
>>> slp.append(subprocess.Popen(['sleep', '40']))
>>> slp[1].poll()
>>> slp[1].poll()
>>> slp[1].poll()
>>> slp[1].poll()
>>> slp[1].poll()
>>> slp[1].poll()
0

或:

>>> for i in slp:
...  i.poll()

参考您的评论:

>>> slp = []
>>> slp.append([subprocess.Popen(['sleep', '40']), None])
>>> slp.append([subprocess.Popen(['sleep', '40']), None])
>>> if slp[1][0].poll() == 0:
...    slp[1][1] = "Finished"
... 
>>> slp
[[<subprocess.Popen object at 0x7f17b1280a90>, None], [<subprocess.Popen object at 0x7f17b0bb0550>, None]]
>>> if slp[1][0].poll() == 0:
...    slp[1][1] = "Finished"
... 
>>> slp
[[<subprocess.Popen object at 0x7f17b1280a90>, None], [<subprocess.Popen object at 0x7f17b0bb0550>, 'Finished']]

循环不同,因为循环拉出列表项,它本身就是一个列表[子进程,变量]:

>>> slp = []
>>> slp.append([subprocess.Popen(['sleep', '40']), None])
>>> slp.append([subprocess.Popen(['sleep', '40']), None])
>>> for i in slp:
...     if i[0].poll() == 0:
...         i[1] = "finished"
... 
>>> slp
[[<subprocess.Popen object at 0x7f17b0ba7ef0>, None], [<subprocess.Popen object at 0x7f17b0b64cf8>, None]]

>>> for i in slp:
...     if i[0].poll() == 0:
...         i[1] = "finished"
... 
>>> slp
[[<subprocess.Popen object at 0x7f17b1280a90>, 'finished'], [<subprocess.Popen object at 0x7f17b0bb0550>, 'finished']]

【讨论】:

  • 我将如何定义子进程是否仍在运行?因为定义它的变量每次都会在循环内被覆盖。
  • 这是一个不同的问题,但简单地说,您可以在循环中检查并将其分配给另一个变量。您的列表proc 可以是列表列表,例如,其中第二项是still running 变量。或者您可以定义与proc 列表相对应的辅助结果列表。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多