我在跨平台系统上编写了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专家都可以帮我找出根本原因吗? 感谢。
答案 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兼容性而编写的。