我想运行一个脚本,它基本上显示如下内容:
Installing XXX... [DONE]
现在,此刻,我在功能成功后使用print打印整行。但是,我现在希望它首先打印“安装xxx ...”,并在功能运行之后添加“DONE”标签;但是在同一条线上。
有任何想法吗?
您可以使用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]")
print函数接受end
参数,默认为"\n"
。将其设置为空字符串可防止它在该行的末尾发出新行。
如果要覆盖前一行(而不是不断添加),可以在print语句的末尾将\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解决方案看起来有点臃肿。例如,退格方法不使用整数参数,并且可能完全取消。
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字符集中Carriage Return的字符串表示形式。它与八角形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()
如果您已将值预先存储在数组中,可以使用以下格式调用它们:
for i in range(0,n):
print arr[i],
我找到了这个解决方案,它正在使用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 'something',
...
print ' else',
并且输出将是
something else
没有必要通过import sys
矫枉过正。最后注意逗号符号。
Python 3+ print("some string", end="");
在最后删除换行插入。阅读更多help(print);
使用sys.stdout.write('Installing XXX... ')
和sys.stdout.write('Done')
。这样,如果要重新创建打印功能,则必须手动使用"\n"
添加新行。我认为可能没有必要为此使用curses。
您应该使用退格键'\ 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%
在这种情况下有关冲洗的其他信息:Why do python print statements that contain 'end=' arguments behave differently in while-loops?
没有任何答案对我有用,因为它们都会暂停,直到遇到新的一行。我写了一个简单的帮手:
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')
“你好”将首先打印出来并在睡眠前冲到屏幕上。之后,您可以使用标准打印。
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
这个简单的例子将在同一行上打印1-10。
for i in range(1,11):
print (i, end=" ")
Print有一个可选的结束参数,它是最后打印的。默认值为换行符,但您可以将其更改为空字符串。例如:print(“hello world!”,end =“”)
print(‘\r’+’something to be override’,end=‘’)
这意味着它会将光标返回到开头,而不是打印某些东西并将以同一行结束。如果在循环中它将在它开始的相同位置开始打印。