【问题标题】:Is there a way to print text with os.system in python?有没有办法在 python 中使用 os.system 打印文本?
【发布时间】:2018-05-16 12:30:01
【问题描述】:

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

我的代码如下:

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 中运行这个脚本) - 部分输出

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 中获得如下输出?

----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>

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

【问题讨论】:

标签: python


【解决方案1】:

似乎os.system 和print 使用在不同时间刷新的不同缓冲区! (解释见here和crosslink)

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

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&gt; /tmp/test.log)
  • 使用subprocess.check_output()或
  • 管道处理个别进程(而不是生成 shell),这有点冗长(参见 here)

希望对你有帮助

【讨论】:

【解决方案2】:

虽然urban的回答提供了很好的背景和一般提示......

...回答您的确切问题。您可以简单地将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' ")

为了更不可读,但更清晰的输出。

【讨论】:

  • 感谢您的评论,尽管 Urban 的回答在这里很有帮助。这是一个刷新缓冲区的问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多