sys.stdout.write()
선호 되는 상황이 있습니까?print
있습니까?
( 예 : 더 나은 성능; 더 이해하기 쉬운 코드)
sys.stdout.write()
와 print
(및 / 또는 파이썬에 왜 두 가지가 있는지) 기본적인 차이점을 묻는 것은 완벽하게 합리적인 질문이며 예제가 필요하지 않습니다. OP는 명령 구문이 혼란 스럽다고 말하지 않았다.
sys.stdout.write()
선호 되는 상황이 있습니까?print
있습니까?
( 예 : 더 나은 성능; 더 이해하기 쉬운 코드)
sys.stdout.write()
와 print
(및 / 또는 파이썬에 왜 두 가지가 있는지) 기본적인 차이점을 묻는 것은 완벽하게 합리적인 질문이며 예제가 필요하지 않습니다. OP는 명령 구문이 혼란 스럽다고 말하지 않았다.
답변:
print
입력을 형식화하고 (수정 가능하지만 기본적으로 인수와 개행 문자 사이에 공백이있는) 얇은 래퍼 일 뿐이며 지정된 객체의 쓰기 함수를 호출합니다. 기본적으로이 객체는입니다 sys.stdout
. 그러나 "chevron"양식을 사용하여 파일을 전달할 수 있습니다. 예를 들면 다음과 같습니다.
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
참조 : https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
Python 3.x에서는 print
함수가되지만 인수 sys.stdout
덕분에 다른 것을 전달할 수 있습니다 file
.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
https://docs.python.org/3/library/functions.html#print를 참조 하십시오.
Python 2.6 이상에서는 print
여전히 명령문이지만 다음과 같은 함수로 사용할 수 있습니다.
from __future__ import print_function
업데이트 : Bakuriu는 인쇄 기능과 인쇄 명령문 사이에 (더 일반적으로 함수와 명령문 사이에) 작은 차이가 있다고 지적했다.
인수를 평가할 때 오류가 발생하는 경우 :
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called
print
작성하지 않은 모든 내용에 개행을 추가 한다는 점도 주목할 가치가 있습니다 sys.stdout.write
.
sys.stdout.write
이중 버전 코드 (예 : Python 2.x 및 Python 3.x와 동시에 작동하는 코드)를 작성해야하는 경우 에도 더 보편적입니다.
print
후행 쉼표 를 추가 하는 줄 바꿈을 억제 할 수 있습니다 .print "this",; print "on the same line as this"
sys.stdout.write()
또한 입력을 버퍼링하고 입력을 fd로 즉시 플러시하지 않을 수 있습니다. 인쇄 기능처럼 작동하도록하려면 다음을 추가해야합니다. sys.stdout.flush()
print
먼저 객체를 문자열로 변환합니다 (아직 문자열이 아닌 경우). 또한 줄의 시작이 아닌 끝에 줄 바꿈 문자가 아닌 경우 객체 앞에 공백을 넣습니다.
사용할 때 stdout
객체를 직접 문자열로 변환해야합니다 (예 : "str"을 호출하여). 개행 문자가 없습니다.
그래서
print 99
다음과 같습니다.
import sys
sys.stdout.write(str(99) + '\n')
print
와 .write()
, 내가 말할 것입니다.
print
줄 바꿈을 생략 할 수 있습니다. Python 2.x에서 끝에 쉼표를 넣으면 공백 문자가 출력되지만 줄 바꿈이 없습니다. 예를 들어 print 99,
Python 3에서는 print(..., end='')
줄 바꿈을 추가하지 않고 공간을 추가하지 end=' '
내 질문하는 경우가 있는지 여부이다
sys.stdout.write()
하는 것이 바람직하다
며칠 전에 스크립트 개발을 마친 후에 유닉스 서버에 업로드했습니다. 내 디버그 메시지는 모두 print
문을 사용했지만 서버 로그 에는 표시 되지 않습니다.
sys.stdout.write
대신 필요할 수 있습니다 .
print()
와 sys.stdout.write()
의 차이에 반대, stdout
그리고 stderr
? 디버깅을 위해 logging
메시지를에 인쇄 하는 모듈을 사용해야합니다 stderr
.
nohup
하고 .out
파일로 리디렉션 할 때도 마찬가지입니다 .
nohup
기본적으로 모든 쓰기를 stdout
하고 stderr
다시 지시하는 것입니다 nohup.out
사용 여부를 무시, print
또는 stdout.write
.
다음 은 Mark Lutz의 Learning Python 의 책을 기반으로하는 몇 가지 샘플 코드입니다 .
import sys
temp = sys.stdout # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123") # nothing appears at interactive prompt
print("another line") # again nothing appears. it's written to log file instead
sys.stdout.close() # ordinary file object
sys.stdout = temp # restore print commands to interactive prompt
print("back to normal") # this shows up in the interactive prompt
텍스트 편집기에서 log.txt를 열면 다음이 나타납니다.
testing123
another line
sys.stdout
인쇄 대신 원하는 상황이 하나 이상 있습니다.
예를 들어 진행률 표시 줄이나 상태 메시지를 그리는 동안 다음 줄로 이동하지 않고 줄을 덮어 쓰려면 다음 과 같이 반복해야합니다.
Note carriage return-> "\rMy Status Message: %s" % progress
그리고 print는 개행을 추가하기 때문에을 사용하는 것이 좋습니다 sys.stdout
.
내 질문하는 경우가 있는지 여부이다
sys.stdout.write()
하는 것이 바람직하다
파일과 stdout 모두에 쓸 수있는 명령 줄 응용 프로그램을 작성하는 경우 편리합니다. 다음과 같은 작업을 수행 할 수 있습니다.
def myfunc(outfile=None):
if outfile is None:
out = sys.stdout
else:
out = open(outfile, 'w')
try:
# do some stuff
out.write(mytext + '\n')
# ...
finally:
if outfile is not None:
out.close()
그것은 당신이 with open(outfile, 'w') as out:
패턴을 사용할 수 없다는 것을 의미 하지만 때로는 그만한 가치가 있습니다.
with
def process(output): # ...
if outfile is None: process(sys.stdout) else: with open(outfile, 'w') as out: process(out)
2.x에서이 print
명령문은 사용자가 제공 한 내용을 사전 처리하여 경로를 따라 문자열로 바꾸고 구분 기호와 줄 바꾸기를 처리하고 파일로의 리디렉션을 허용합니다. 3.x는 함수로 변환하지만 여전히 동일한 책임이 있습니다.
sys.stdout
문자열이나 그 줄을 따라 뭔가를 쓰는 방법이있는 파일 또는 파일과 같습니다.
예를 들어, 긴 프로세스에서 정보를 제공하는 등 동적 인쇄가 유용한 경우에 바람직합니다.
import time, sys
Iterations = 555
for k in range(Iterations+1):
# some code to execute here ...
percentage = k / Iterations
time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
sys.stdout.write(time_msg)
sys.stdout.flush()
time.sleep(0.01)
>>> sys.stdout.write(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1
위의 예를 관찰하십시오.
sys.stdout.write
문자열이 아닌 객체를 쓸 수 있지만하지 않을 print
것이다
sys.stdout.write
결국 새로운 라인 기호를 추가 할 수 있지만하지 않을 print
것이다
우리가 깊이 잠수하면
sys.stdout
print ()의 출력에 사용될 수있는 파일 객체입니다
파일 인수 print()
가 지정되지 않은 경우 sys.stdout
사용됩니다
인쇄하기에 sys.stdout.write ()가 선호되는 상황이 있습니까?
예를 들어 숫자를 인수로 전달할 때 별을 피라미드 형식으로 인쇄하는 작은 함수를 작업하고 있습니다. 끝 = "를 사용하여 별도의 줄에 인쇄 할 수는 있지만 sys.stdout.write 를 조정하여 사용했습니다. 와 인쇄 이 일을 확인합니다. stdout.write 에 대해 자세히 설명하기 위해 print가 항상 별도의 행에 내용 을 인쇄 하는 동일한 행에 인쇄 합니다.
import sys
def printstars(count):
if count >= 1:
i = 1
while (i <= count):
x=0
while(x<i):
sys.stdout.write('*')
x = x+1
print('')
i=i+1
printstars(5)
인쇄하기에 sys.stdout.write ()가 선호되는 상황이 있습니까?
멀티 스레딩 상황에서 stdout이 인쇄보다 나은 것으로 나타났습니다. 대기열 (FIFO)을 사용하여 인쇄 할 줄을 저장하고 인쇄 Q가 비어있을 때까지 인쇄 줄 앞에 모든 스레드를 고정시킵니다. 그럼에도 불구하고 print를 사용하면 때로는 디버그 I / O (윙 프로 IDE 사용)에서 최종 \ n이 손실됩니다.
문자열에서 \ n과 함께 std.out을 사용하면 디버그 I / O 형식이 올바르게 설정되고 \ n이 정확하게 표시됩니다.
Python 3에는 print over를 사용해야하는 유효한 이유가 sys.stdout.write
있지만이 이유를 sys.stdout.write
대신 사용해야하는 이유로 바꿀 수도 있습니다 .
이 이유는 print가 파이썬 3의 함수이기 때문에 이것을 무시할 수 있기 때문입니다. 따라서 간단한 스크립트로 어디서나 print를 사용할 수 있고 stderr
대신 인쇄 문을 작성해야한다고 결정할 수 있습니다 . 이제 인쇄 기능을 다시 정의 할 수 있으며 내장 모듈을 사용하여 인쇄 기능을 변경하여 전역으로 인쇄 기능을 변경할 수도 있습니다. 물론 file.write
파일 형식을 지정할 수 있지만 덮어 쓰기 인쇄를 사용하면 줄 구분 기호 또는 인수 구분 기호를 다시 정의 할 수도 있습니다.
다른 방법은입니다. 아마도 당신은 당신이 글을 쓰는 것을 확실히 확신 stdout
하지만, 다른 것으로 인쇄를 바꾸고,를 사용하기로 결정하고 sys.stdout.write
, 오류 로그 또는 다른 것을 위해 print 를 사용할 수 있다는 것을 알고 있습니다.
따라서 사용 방법은 사용 방법에 따라 다릅니다. print
더 유연하지만 사용하고 사용하지 않는 이유가 될 수 있습니다. 나는 여전히 유연성을 선택하고 인쇄를 선택합니다. print
대신 사용해야 하는 또 다른 이유 는 친숙하기 때문입니다. 더 많은 사람들이 이제 인쇄의 의미를 알지 못합니다 sys.stdout.write
.
차이점 중 하나는 16 진수 모양으로 바이트를 인쇄하려고 할 때 다음과 같습니다. 의 예를 들어, 우리는 그 진수 값을 알고 255
있다 0xFF
진수 외관 :
val = '{:02x}'.format(255)
sys.stdout.write(val) # prints ff2
print(val) # prints ff
write()
추가 \n
하고 반환 하지 않고 함수의 반환 값 (문자 수), 16 진수 표현 또는 표시되는 다른 내용은 중요 하지 않기 때문 입니다.
파이썬 2에서는 함수를 전달 해야하는 경우 os.sys.stdout.write를 변수에 할당 할 수 있으며 인쇄를 사용 하여이 작업을 수행 할 수 없습니다.
>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>
예상대로 작동합니다.
>>> cmd=print
File "<stdin>", line 1
cmd=print
^
SyntaxError: invalid syntax
작동하지 않습니다. 인쇄는 마법의 기능입니다.
파이썬 3에서 print
와 sys.stdout.write
지적 의 차이점은 터미널에서 실행될 때 반환되는 값입니다. 파이썬 3에서는 sys.stdout.write
문자열의 길이를 print
반환 하지만 그냥 반환None
.
예를 들어, 터미널에서 대화식으로 다음 코드를 실행하면 대화식으로 실행될 때 길이가 반환되고 출력되므로 문자열 다음에 길이가 인쇄됩니다.
>>> sys.stdout.write(" hi ")
hi 4