如何检查是否不是一个而是任何 Popen 子进程仍然是 运行?

How to check if not one but any Popen subprocess at all is still running?

我知道可以检查子进程是否仍然是 运行.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

根据 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']]

循环不同,因为循环拉出列表项,它本身就是一个列表[subprocess, variable]:

>>> 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']]