繁体   English   中英

Python:在记录内存时获取子进程STDOUT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM