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> |
期待社区的回答和评论。 另外,如果这是一个重复的问题,请指出相似的问题,因为我没有得到类似的问答。
似乎
以下对我有用(强制刷新输出):
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的答案提供了很好的背景信息和一般性提示...
...回答您的确切问题。 您可以简单地将
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'") |
可读性较差,但输出却更加鲜明。