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

Is there a way to print text with os.system in python?

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

我的代码如下:

1
2
3
4
5
6
7
8
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)

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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

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

1
2
3
4
5
----CPU----
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
<iteration-number>

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


似乎os.systemprint使用了在不同时间刷新的不同缓冲区! (有关说明,请参见此处和交叉链接)

以下对我有用(强制刷新输出):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()或
  • 用管道传递单个过程(而不是生成外壳),这更复杂一些(请参见此处)

希望能帮助到你


尽管Urban的答案提供了很好的背景信息和一般性提示...

...回答您的确切问题。 您可以简单地将date呼叫添加到单线的每个呼叫中,例如

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

要么

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

可读性较差,但输出却更加鲜明。