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

时间:2017-04-13 21:45:47

标签: python subprocess

这是我的问题:

  • 我正在尝试编写一个代码来记录子进程作业占用的内存,并同时获取该作业的标准输出。

为此,我用子进程调用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

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

我通过将内存日志记录放在一个单独的线程中找到了解决方案。它不会再与循环冲突,以检索子进程的stdout / stderr。