无法逐行输出print(var,end ='')

时间:2015-05-29 06:15:31

标签: python

我在跨平台系统上编写了ping主机的代码。

代码的内容如下:

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

任何python专家都可以帮我找出根本原因吗? 感谢。

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

您需要阅读流程的标准输出并对其进行一些控制,以便您可以对&#34;流程负载&#34;进行一些在线打印。同样。

示例:

#!/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兼容性而编写的。