[英]Python : Get subprocess STDOUT while logging the memory
这是我的问题:
为此,我使用子进程调用python脚本:
res = Popen(args,shell = False,stderr = STDOUT,stdout = PIPE)
为了获得内存,我使用res.pid获得了工作的pid。 然后我得到psutil的内存:
p = psutil.Process(pid)
mem_usage = p.memory_full_info()
我想通过以下方式进行组合:
运行代码
每秒将内存记录在mem_usage中
将stderr记录在字符串列表中
我尝试了这个:
while res.poll() is None:
(total_rss_Mo, total_vms_Mo, total_uss_Mo) = get_mem(pid)
print "MEM ",total_rss_Mo, total_vms_Mo, total_uss_Mo
# Wait a bit before next memory scam
time.sleep(1)
stderr, stdout = res.communicate()
结果不是我所期望的。 在开始的20年代,它可以工作,但随后工作就进入睡眠状态,并且永无止境:
MEM 7.77734375 152.52734375 4.30078125
MEM 290.49609375 1299.66015625 284.265625
MEM 436.53515625 1372.29296875 427.77734375
MEM 443.61328125 1633.8125 434.921875
MEM 544.26171875 1732.52734375 535.40625
MEM 548.59765625 1737.015625 539.89453125
MEM 552.765625 1741.01953125 543.8984375
MEM 552.51953125 1741.01953125 543.8984375
MEM 552.5703125 1741.01953125 543.8984375
MEM 552.55078125 1741.01953125 543.8984375
MEM 552.7265625 1741.01953125 543.8984375
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
MEM 455.63671875 1643.8828125 446.76171875
似乎stderr缓冲区已满,因此作业处于保留状态。 如何获取stderr / stdout并同时记录我的内存? 如果我尝试在循环中读取stdout,则循环将继续进行到作业结束,并且在执行作业期间我无法再记录内存了:
while True:
line = res.stdout.readline()
if not line or line == "":
break
print line
谢谢你的帮助,
晃
我通过将内存日志记录放在单独的线程中找到了解决方案。 它不再与检索子进程的stdout / stderr的循环冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.