有没有办法在python中使用os.system打印文本?

时间:2017-12-02 15:54:41

标签: python

我正在尝试使用python的os.system()命令记录linux中特定进程的CPU和RAM消耗的输出。为了区分每次迭代时的输出,我在os.system()命令的上方和下方添加了带有迭代次数的print语句。

我的代码如下:

B[1]

现在,在运行脚本并查看日志后,它不符合我的期望。我看到,对于所有迭代,首先打印os.system的输出,然后打印那些打印语句。这并不能帮助我区分每次迭代的输出。

运行python脚本后输出script.py>& log.txt中。 (我在linux env中运行这个脚本) - 部分输出

import os
i=0
while i<30:
    print "----CPU----"
    op=os.system("ps -raxxxo pid,%cpu,%mem,vsize,time,command | grep -E 'java|gui' ")
    print i
    i+=1
    sleep(1.0/3.0)

如何在python中输出如下所示的输出?

1332   0.0  3.6  572960     5:56.04 /data/bin/gui
20978   0.0  0.5   79480     1:47.16 java
13040   0.0  0.0   18976     0:00.00 grep -E java|gui
1332   0.0  3.6  572960     5:56.04 /data/bin/gui
20978   0.0  0.5   79480     1:47.16 java
13043   0.0  0.0   18976     0:00.00 grep -E java|gui
----CPU----
0
1
----CPU----
0
2

期待社区的回答和评论。此外,如果这是一个重复的问题,请指出类似的问题,因为我没有得到类似的问答。

2 个答案:

答案 0 :(得分:1)

似乎os.systemprint使用在不同时间刷新的不同缓冲区! (有关解释,请参阅herecrosslink

以下为我工作(强制刷新输出):

import os
import sys
from time import sleep


i=0
while i<30:
    print "----CPU----"
    sys.stdout.flush()
    op=os.system("ps -e -o pid,%cpu,%mem,vsize,time,command | grep java | grep -v grep ")
    sys.stdout.flush()
    print i
    sys.stdout.flush()
    i+=1
    sleep(1.0/3.0)

可替换地:

  • 使用-u标志禁用缓冲输出(python -u /tmp/test.py 1> /tmp/test.log
  • 使用subprocess.check_output()
  • 管道个别进程(而不是产生一个shell),这有点啰嗦(见here

希望有所帮助

答案 1 :(得分:0)

虽然城市的答案提供了很好的背景和一般提示......

...回答你的确切问题。您可以简单地为您的单行电话的每次通话添加date来电,例如

op=os.system("date && ps -raxxxo pid,%cpu,%mem,vsize,time,command | grep -E 'java|gui' ")

op=os.system("date +%s && ps -raxxxo pid,%cpu,%mem,vsize,time,command | grep -E 'java|gui' ")

用于不太可读但更明显的输出。