【发布时间】:2014-04-11 09:05:51
【问题描述】:
我正在使用带有 subprocess.Popen() 的非常基本的设置并将标准输出定向到一个变量,我稍后将返回到我的 python 脚本的不同部分。
这是我的基本 Popen 代码:
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
errcode = process.returncode
print out
这适用于许多基本用例,例如 ls -al 或类似的。但是,我想知道如何处理从更长(或无限期)运行的进程(例如tail -f foo.log)定期和一致地获取输出。有没有办法在循环中定期读取标准输出?或者生成一个线程来定期检查并返回每个线程?这里最好的方法是什么?
谢谢!
【问题讨论】:
-
不要
communicate,而是poll、stdout.read()和returncode,酌情参见manual -
您可以使用read subprocess stdout line by line 读取单个流。要分别读取两个流而不阻塞,请参阅Non-blocking read on a subprocess.PIPE in python(有使用线程、fcntl、select、iocp的解决方案)
标签: python shell subprocess stdout