我想运行一个脚本,该脚本基本上显示如下输出:
Installing XXX... [DONE]
目前,我Installing XXX...
先打印,然后再打印[DONE]
。
不过,我现在想打印Installing xxx...
并[DONE]
在同一行。
有任何想法吗?
我想运行一个脚本,该脚本基本上显示如下输出:
Installing XXX... [DONE]
目前,我Installing XXX...
先打印,然后再打印[DONE]
。
不过,我现在想打印Installing xxx...
并[DONE]
在同一行。
有任何想法吗?
Answers:
您可以使用该print
语句执行此操作,而无需导入sys
。
def install_xxx():
print "Installing XXX... ",
install_xxx()
print "[DONE]"
行尾的逗号会print
阻止print
发出新行(您应注意,输出末尾会有多余的空格)。
Python 3解决方案
由于上述内容在Python 3中不起作用,因此您可以改为这样做(同样,不导入sys
):
def install_xxx():
print("Installing XXX... ", end="", flush=True)
install_xxx()
print("[DONE]")
打印功能接受end
默认值为的参数"\n"
。将其设置为空字符串可防止它在该行的末尾发出新行。
print("...", end="", flush=True)
在Python 3中使用,在Python 2中添加sys.stdout.flush()
调用。
print("Progress: {}%".format(var), end="\r", flush=True)
您可以简单地使用:
print 'something',
...
print ' else',
和输出将是
something else
无需过度杀伤import sys
。注意末尾的逗号符号。
Python 3+
print("some string", end="");
删除结尾处的换行符。阅读更多help(print);
print
函数具有稍微不同的语法在Python 2 VS 3
您应使用退格键' \ r '或(' \ x08 ')char返回控制台输出中的上一个位置
Python 2+:
import time
import sys
def backspace(n):
sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(s) # just print
sys.stdout.flush() # needed for flush when using \x08
backspace(len(s)) # back n chars
time.sleep(0.2) # sleep for 200ms
Python 3:
import time
def backline():
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print(s, end='') # just print and flush
backline() # back to the beginning of line
time.sleep(0.2) # sleep for 200ms
此代码将在一行中从0%到100%计数。最终值将是:
> python test.py
100%
在这种情况下,有关刷新的其他信息在这里:为什么包含'end ='参数的python打印语句在while循环中的行为不同?
没有一个答案对我有用,因为它们都暂停了,直到遇到新的一行。我写了一个简单的助手:
def print_no_newline(string):
import sys
sys.stdout.write(string)
sys.stdout.flush()
要测试它:
import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')
“ hello”将首先打印出来,然后在睡眠前冲洗到屏幕。之后,您可以使用标准打印。
sys.stdout.write
将打印而无需回车
import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")
http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines
print('\r' + 'something to be override', end='')
这意味着它将把光标返回到开始处,而不是打印一些内容并在同一行结束。如果处于循环中,它将在开始的位置开始打印。
print(’something to be override’, end=‘\r’)
比较简单。
如果你想覆盖前一行(而不是不断地增加它),你可以结合\r
使用 print(),
,在打印语句的结束。例如,
from time import sleep
for i in xrange(0, 10):
print("\r{0}".format(i)),
sleep(.5)
print("...DONE!")
将计数0到9,替换控制台中的旧数字。的"...DONE!"
将打印在同一行作为最后的反击,9。
对于OP,这将允许控制台将安装的完成百分比显示为“进度条”,您可以在其中定义开始和结束字符位置,并在其间更新标记。
print("Installing |XXXXXX | 30%"),
这里是@ Vadim-Zin4uk从3.0版本派生的2.7兼容版本:
Python 2
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print '{0}\r'.format(s), # just print and flush
time.sleep(0.2)
为此,提供的3.0解决方案看起来有些looks肿。例如,退格方法不使用整数参数,可能完全可以使用。
Python 3
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print('{0}\r'.format(s), end='') # just print and flush
time.sleep(0.2) # sleep for 200ms
两者都已经过测试和工作。
这是一个非常古老的线程,但是这里有一个非常详尽的答案和示例代码。
\r
是ASCII字符集的回车的字符串表示形式。与八进制015
[ chr(0o15)
]或十六进制0d
[ chr(0x0d)
]或十进制13
[ chr(13)
]相同。请参阅man ascii
无聊的阅读。它(\r
)是一种可移植的表示形式,足以让人们阅读。这很简单,就是在不推进纸张的情况下将打字机上的笔架一直移动到起点。这是CR
一部分CRLF
,这意味着回车和换行。
print()
是Python 3中的函数。在Python 2(您可能会感兴趣的任何版本)中,print
可以通过从__future__
模块中导入函数的定义来强制使用该函数。该print
功能的好处在于,您可以指定在\n
结尾处打印的内容,而不是在每次print()
调用结束时打印换行符的默认行为。
sys.stdout.flush
告诉Python刷新标准输出的输出,print()
除非您另外指定,否则发送标准输出的位置。您还可以通过运行python -u
或设置环境变量来获得相同的行为PYTHONUNBUFFERED=1
,从而跳过import sys
和sys.stdout.flush()
调用。通过这样做,您获得的收益几乎完全为零,并且如果您方便地忘记了必须在应用程序正常运行之前执行该步骤,那么调试起来就不太容易。
和一个样本。请注意,这可以在Python 2或3中完美运行。
from __future__ import print_function
import sys
import time
ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}
for i in range(1, ANS + 1):
if i in FACTORS:
print('\r{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
我找到了这个解决方案,并且可以在Python 2.7上运行
# Working on Python 2.7 Linux
import time
import sys
def backspace(n):
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(string)
backspace(len(s)) # back for n chars
sys.stdout.flush()
time.sleep(0.2) # sleep for 200ms
print
对于Python 2.7是不正确的语法,即使使用正确的语法,代码也无法正常工作。