기본적으로 다음과 같은 출력을 보여주는 스크립트를 실행하고 싶습니다.
Installing XXX... [DONE]
현재 Installing XXX...
먼저 인쇄 한 다음 인쇄 [DONE]
합니다.
그러나 이제는 같은 줄에 인쇄 Installing xxx...
하고 싶습니다 [DONE]
.
어떤 아이디어?
기본적으로 다음과 같은 출력을 보여주는 스크립트를 실행하고 싶습니다.
Installing XXX... [DONE]
현재 Installing XXX...
먼저 인쇄 한 다음 인쇄 [DONE]
합니다.
그러나 이제는 같은 줄에 인쇄 Installing 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]")
인쇄 기능은 end
기본값 인을 사용 "\n"
합니다. 빈 문자열로 설정하면 줄 끝에서 새 줄을 발행 할 수 없습니다.
print("...", end="", flush=True)
파이썬 3는, 파이썬 2에서 추가 sys.stdout.flush()
전화.
print("Progress: {}%".format(var), end="\r", flush=True)
간단히 이것을 사용할 수 있습니다 :
print 'something',
...
print ' else',
출력은
something else
에 의해 과잉 살필 필요가 없습니다 import sys
. 끝에 쉼표 기호에주의하십시오.
print("some string", end="");
마지막에 줄 바꿈 삽입을 제거하는 Python 3 이상 . 더 읽어보기help(print);
print
함수 파이썬 2 VS 3. 약간 다른 구문
콘솔 출력에서 이전 위치로 돌아가 려면 백 스페이스 ' \ r '또는 ( ' \ x08 ') char을 사용해야 합니다.
파이썬 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
파이썬 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%
이 경우 flush에 대한 추가 정보는 다음과 같습니다. 왜 'end ='인수를 포함하는 python print 문이 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 호환 버전입니다.
파이썬 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 솔루션이 약간 부풀어 보입니다. 예를 들어, 백 스페이스 메소드는 정수 인수를 사용하지 않으며 아마도 완전히 제거 될 수 있습니다.
파이썬 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 문자 집합에서 캐리지 리턴 의 문자열 표현입니다 . 8 진수 015
[ chr(0o15)
] 또는 16 진 0d
[ chr(0x0d)
] 또는 10 진수 13
[ chr(13)
]와 같습니다. man ascii
지루한 읽기를 참조하십시오 . ( \r
)는 이식성이 뛰어나며 사람들이 쉽게 읽을 수 있습니다. 그것은 단순히 용지를 전진시키지 않고 타자기의 캐리지를 처음으로 다시 이동시키는 것을 의미합니다. 캐리지 리턴 및 줄 바꿈 을 의미 하는 CR
부분입니다 .CRLF
print()
Python 3의 함수입니다. Python 2 (사용하고자하는 모든 버전) print
에서 __future__
모듈 에서 정의를 가져 와서 함수에 강제로 포함시킬 수 있습니다 . 이 print
기능 의 장점은 \n
모든 print()
통화 가 끝날 때 새 줄을 인쇄하는 기본 동작을 무시하고 마지막에 인쇄 할 항목을 지정할 수 있다는 것 입니다.
sys.stdout.flush
파이썬이 표준 출력 의 출력을 플러시하도록 지시 합니다 . 이것은 print()
달리 지정하지 않는 한 출력을 보내는 곳 입니다. 또한 python -u
environment variable 로 실행 하거나 설정 하여 동일한 동작을 얻을 수 있으므로 및 호출 PYTHONUNBUFFERED=1
을 건너 뜁니다 . 그렇게하면 얻을 수있는 양은 거의 정확하게 0이며 응용 프로그램이 올바르게 작동하기 전에 해당 단계를 수행해야한다는 것을 잊어 버린 경우 디버깅하기가 쉽지 않습니다.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()
이 Quora post를 찾았 습니다 .이 예제는 저에게 효과적이었습니다 (파이썬 3). 필요한 것에 더 가깝습니다 (예 : 전체 이전 줄 지우기).
그들이 제공하는 예는 다음과 같습니다.
def clock():
while True:
print(datetime.now().strftime("%H:%M:%S"), end="\r")
다른 사람들이 제안한 것처럼 같은 줄에 인쇄하려면 다음을 사용하십시오. end=""
이 솔루션을 찾았으며 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의 잘못된 구문이며 올바른 구문으로도 코드가 작동하지 않습니다.