如何检查是否没有一个但任何Popen子进程仍在运行?



我知道有可能检查子进程是否仍在使用.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']]

最新更新