2015-05-29 22 views
1

我为跨平台系统上的主机编写了一个代码。无法通过print逐行输出(var,end ='')

代码的内容如下:

import psutil 
import subprocess 

proc = subprocess.Popen(["ping -c 5 8.8.8.8"],shell=True) 
for x in range(5): 
    getLoading = psutil.cpu_percent(interval=1) 
    print(str(getLoading),end='<--') 

print('done') 

我希望我可以有如下结果:

64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
5.0<-- 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
4.5<-- 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
4.1<-- 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
3.5<--  
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
4.0<-- 
done 

我得到的结果,我希望Windows7的上/ python3.4.3,但是失败了结果在CentOS 6.5/python3.4.3上。 Linux上的结果看起来如下:

64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=5ms 
5.0<--4.5<--4.1<--3.5<--4.0<--done 

可以在任何蟒蛇专家帮我找出根本原因? 谢谢。

+0

你有几个错误,我立刻看到:'在范围X(5)''需要:'和'打印(完成)'应该是'打印( '完成')' – Scott

+0

嗨,斯科特。感谢您的回复。这是错字。我修好了它。但这不是失败结果的根本原因。 – Pin

+0

我意识到,只是希望它是正确的。 – Scott

回答

1

这让我想起了打印功能“缓冲”,然后一些数据后写它的。 我在代码中使用print时遇到了同样的问题。为了避免这样的问题,我会用一个记录器,这将立即打印代码

import logging 
FORMAT = '%(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(
    format=FORMAT, level=logging.DEBUG, datefmt='%Y/%m/%d %H:%M:%S') 
logger = logging.getLogger('MyLogger') 
logger.setLevel(logging.INFO) 


import psutil 
import subprocess 

proc = subprocess.Popen(["ping -c 5 8.8.8.8"], shell=True) 
for x in range(5): 
    getLoading = psutil.cpu_percent(interval=1) 
    logger.info(str(getLoading) + '<--') 

logger.info('done') 
+0

是的你是对的;有**会有一点缓冲继续,所以*会在输出中稍微延迟;但我不认为这是OP本身的问题:) –

1

您需要在过程的stdout阅读和有一点进行控制的,所以你可以做一些在线印刷的“流程负载”。

实施例:

#!/usr/bin/env python 

from __future__ import print_function 

import sys 
import psutil 
import subprocess 

try: 
    range = xrange 
except NameError: 
    pass 


p = subprocess.Popen(["ping", "-c", "5", "8.8.8.8"], stdout=subprocess.PIPE) 

encoding = sys.getdefaultencoding() 

for line in p.stdout: 
    load = psutil.cpu_percent(interval=1) 
    print("{0:s}{1:0.2f}<--".format(line.decode(encoding), load)) 
print("done") 

输出:

$ ./foo.py 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 
21.10<-- 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=15.6 ms 
15.40<-- 
64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=15.6 ms 
13.20<-- 
64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=15.6 ms 
20.70<-- 
64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=15.5 ms 
19.90<-- 
64 bytes from 8.8.8.8: icmp_seq=5 ttl=52 time=15.6 ms 
11.00<-- 

19.50<-- 
--- 8.8.8.8 ping statistics --- 
17.40<-- 
5 packets transmitted, 5 received, 0% packet loss, time 4007ms 
12.90<-- 
rtt min/avg/max/mdev = 15.596/15.629/15.669/0.114 ms 
16.60<-- 
done 

NB:这是为Python 2/3兼容性写入。

+0

我得到'print(“{0:s} {1:0.2f} < - ”。format(line,load)) TypeError:传递给对象的非空格式字符串.__ format__' – Scott

+1

对不起修复了这个问题;查看更新。原因是''line''是一个''bytes''字符串,所以需要解码,因为我们使用了''str''和''str.format()''。 –

+0

非常酷詹姆斯。不知道你为什么得到-1,但+1教我一些很酷的东西。 – Scott