首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用print逐行输出(var,end='')

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

Stack Overflow用户
提问于 2015-05-29 14:15:31
回答 2查看 47关注 0票数 1

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

代码内容如下:

代码语言:javascript
复制
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')

我希望我能得到如下结果:

代码语言:javascript
复制
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上的结果如下:

代码语言:javascript
复制
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专家能帮我找出根本原因?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-05-29 14:32:03

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-05-29 14:33:41

您需要读取进程的stdout并对其进行一些控制,以便还可以对"process load“进行一些内联打印。

示例:

代码语言:javascript
复制
#!/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")

输出:

代码语言:javascript
复制
$ ./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

Python:这是为兼容 2/3而编写的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30522393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档