我想获取我的子流程的输出。由于它无限期运行,我想在满足某些条件时终止它。
当我使用check_output
启动子流程时,我得到了输出但没有终止流程的句柄:
output = subprocess.check_output(cmd, shell=True)
当我使用Popen
或run
启动子流程时,我得到了一个终止该流程的句柄,但没有输出。
p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)
我怎么都能得到?
答案 0 :(得分:1)
什么时候可以知道您已获得完整的过程输出?当进程终止时。因此,无需手动终止它。只需等待它结束,便可以使用check_output
。
现在,如果您要等待给定模式出现,请然后终止,这就是其他内容。只需逐行读取,如果某些模式匹配,则中断循环并结束该过程
p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid) # add stderr=subprocess.PIPE) to merge output & error
for line in p.stdout:
if b"some string" in line: # output is binary
break
p.kill() # or p.terminate()
答案 1 :(得分:0)
您需要告诉Popen
您想阅读标准输出,但这可能有点棘手。
p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid, stdout=subprocess.PIPE)
while True:
chunk = p.stdout.read(1024) # this will hang forever if there's nothing to read
p.terminate()
答案 2 :(得分:0)
尝试:
import subprocess
p = subprocess.Popen("ls -a", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print((p.stdout.read()))
if p.stdout.read() or p.stderr.read():
p.terminate()