sys.stdout.write와 print의 차이점은 무엇입니까?


376

sys.stdout.write()선호 되는 상황이 있습니까?print 있습니까?

( 예 : 더 나은 성능; 더 이해하기 쉬운 코드)


4
어떤 버전의 Python입니까? 2.x 또는 3.x?
Mark Byers

파이썬 3에 대한 경험이 없지만 솔직히 두 가지 모두에 대해 알고 싶습니다. 질문을 업데이트했습니다.
Johanna Larsson

17
@ S.Lott : sys.stdout.write()print(및 / 또는 파이썬에 왜 두 가지가 있는지) 기본적인 차이점을 묻는 것은 완벽하게 합리적인 질문이며 예제가 필요하지 않습니다. OP는 명령 구문이 혼란 스럽다고 말하지 않았다.
smci

답변:


294

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

64
또한 print작성하지 않은 모든 내용에 개행을 추가 한다는 점도 주목할 가치가 있습니다 sys.stdout.write.
Michael Mior

5
sys.stdout.write이중 버전 코드 (예 : Python 2.x 및 Python 3.x와 동시에 작동하는 코드)를 작성해야하는 경우 에도 더 보편적입니다.
andreb

3
@MichaelMior print후행 쉼표 를 추가 하는 줄 바꿈을 억제 할 수 있습니다 .print "this",; print "on the same line as this"
drevicko

1
@ bjd2385 여기는 >>rshift 연산자가 아니라 특정 "chevron"형식의 print문장입니다. docs.python.org/2/reference/…
luc

5
sys.stdout.write()또한 입력을 버퍼링하고 입력을 fd로 즉시 플러시하지 않을 수 있습니다. 인쇄 기능처럼 작동하도록하려면 다음을 추가해야합니다. sys.stdout.flush()
kerbelp

151

print먼저 객체를 문자열로 변환합니다 (아직 문자열이 아닌 경우). 또한 줄의 시작이 아닌 끝에 줄 바꿈 문자가 아닌 경우 객체 앞에 공백을 넣습니다.

사용할 때 stdout 객체를 직접 문자열로 변환해야합니다 (예 : "str"을 호출하여). 개행 문자가 없습니다.

그래서

print 99

다음과 같습니다.

import sys
sys.stdout.write(str(99) + '\n')

32
개행 문자를 언급하면 ​​+1! 이 사이의 주요 차이 print.write(), 내가 말할 것입니다.
Eric O Lebigot

9
참고 : print줄 바꿈을 생략 할 수 있습니다. Python 2.x에서 끝에 쉼표를 넣으면 공백 문자가 출력되지만 줄 바꿈이 없습니다. 예를 들어 print 99,Python 3에서는 print(..., end='')줄 바꿈을 추가하지 않고 공간을 추가하지 end=' '
않아도

40
@EOL EOL이라는 이름의 누군가가 '\ n'에 대해 언급하는 것이 얼마나 재밌습니까? 나는 인생이 없다. 날 죽여
Depado

2
사실이 아닙니다 print.
python2.X의

41

내 질문하는 경우가 있는지 여부이다 sys.stdout.write()하는 것이 바람직하다 print

며칠 전에 스크립트 개발을 마친 후에 유닉스 서버에 업로드했습니다. 내 디버그 메시지는 모두 print문을 사용했지만 서버 로그 에는 표시 되지 않습니다.

sys.stdout.write대신 필요할 수 있습니다 .


8
응? 당신은이 사이에 차이가 확실 print()sys.stdout.write()의 차이에 반대, stdout그리고 stderr? 디버깅을 위해 logging메시지를에 인쇄 하는 모듈을 사용해야합니다 stderr.
ostrokach

1
당신. 파일 을 사용 nohup하고 .out파일로 리디렉션 할 때도 마찬가지입니다 .
conner.xyz

1
sys.stdout.flush ()를 사용하면 도움이됩니다.
suprit chaudhary 2016 년

당신이 사용하는 경우 nohup기본적으로 모든 쓰기를 stdout하고 stderr다시 지시하는 것입니다 nohup.out사용 여부를 무시, print또는 stdout.write.
Zheng Liu

40

다음 은 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

화면에 인쇄하고 파일에 쓸 수있는 방법이 있습니까?
Devesh Saini

5
@DeveshSaini : 예, 적어도 write () 및 flush () 함수가있는 프록시 클래스로 sys.stdout을 덮어 씁니다. 여기에 예제 스 니펫을 작성했습니다 .
ponycat

14

sys.stdout인쇄 대신 원하는 상황이 하나 이상 있습니다.

예를 들어 진행률 표시 줄이나 상태 메시지를 그리는 동안 다음 줄로 이동하지 않고 줄을 덮어 쓰려면 다음 과 같이 반복해야합니다.

Note carriage return-> "\rMy Status Message: %s" % progress

그리고 print는 개행을 추가하기 때문에을 사용하는 것이 좋습니다 sys.stdout.


2
print가 새로운 줄을 추가한다면 print ( 'message', end = '') 대신에
Apoorv Patne

8

내 질문하는 경우가 있는지 여부이다 sys.stdout.write()하는 것이 바람직하다print

파일과 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:패턴을 사용할 수 없다는 것을 의미 하지만 때로는 그만한 가치가 있습니다.


엄밀히 말하면 - / (필요한 경우 개행 추가)를 사용할 있습니다 . 그러나 확실히 깨끗하지는 않습니다. withdef process(output): # ...if outfile is None: process(sys.stdout) else: with open(outfile, 'w') as out: process(out)
기금 모니카의 소송

4

2.x에서이 print명령문은 사용자가 제공 한 내용을 사전 처리하여 경로를 따라 문자열로 바꾸고 구분 기호와 줄 바꾸기를 처리하고 파일로의 리디렉션을 허용합니다. 3.x는 함수로 변환하지만 여전히 동일한 책임이 있습니다.

sys.stdout 문자열이나 그 줄을 따라 뭔가를 쓰는 방법이있는 파일 또는 파일과 같습니다.


3

예를 들어, 긴 프로세스에서 정보를 제공하는 등 동적 인쇄가 유용한 경우에 바람직합니다.

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)

2
print (time_msg, end = '') 대신 sys.stdout.write (time_msg) sys.stdout.flush ()도 작동합니다
rluts

2
>>> 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

위의 예를 관찰하십시오.

  1. sys.stdout.write문자열이 아닌 객체를 쓸 수 있지만하지 않을 print것이다

  2. sys.stdout.write결국 새로운 라인 기호를 추가 할 수 있지만하지 않을 print것이다

우리가 깊이 잠수하면

sys.stdout print ()의 출력에 사용될 수있는 파일 객체입니다

파일 인수 print()가 지정되지 않은 경우 sys.stdout사용됩니다


1

인쇄하기에 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)

1

인쇄하기에 sys.stdout.write ()가 선호되는 상황이 있습니까?

멀티 스레딩 상황에서 stdout이 인쇄보다 나은 것으로 나타났습니다. 대기열 (FIFO)을 사용하여 인쇄 할 줄을 저장하고 인쇄 Q가 비어있을 때까지 인쇄 줄 앞에 모든 스레드를 고정시킵니다. 그럼에도 불구하고 print를 사용하면 때로는 디버그 I / O (윙 프로 IDE 사용)에서 최종 \ n이 손실됩니다.

문자열에서 \ n과 함께 std.out을 사용하면 디버그 I / O 형식이 올바르게 설정되고 \ n이 정확하게 표시됩니다.


이 경우 stdout이 인쇄보다 더 나은 이유를 알고 있습니까, 아니면이 일화입니까? 이런 일이 발생하는 최소한의 실제 사례를 제공해 주시겠습니까?
user2653663

내 생각은 stdout이 인쇄보다 낮은 수준에서 작동한다는 것입니다. 두 인쇄 루틴이 stdout을 통해 공급되기 위해 싸우면서 스레드 손상이 발생했습니다. 각 스레드에서 하나씩 stdout을 작성하면 손상이 제거되었습니다.
David Poundall


1

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.


1

차이점 중 하나는 16 진수 모양으로 바이트를 인쇄하려고 할 때 다음과 같습니다. 의 예를 들어, 우리는 그 진수 값을 알고 255있다 0xFF진수 외관 :

val = '{:02x}'.format(255) 

sys.stdout.write(val) # prints ff2
print(val)            # prints ff

그건이게 아니에요 대화 형 쉘에서만 발생하며 ... 왜냐하면 대화 형 쉘 디스플레이를 write()추가 \n하고 반환 하지 않고 함수의 반환 값 (문자 수), 16 진수 표현 또는 표시되는 다른 내용은 중요 하지 않기 때문 입니다.
Ondrej K.

0

파이썬 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

작동하지 않습니다. 인쇄는 마법의 기능입니다.


0

파이썬 3에서 printsys.stdout.write지적 의 차이점은 터미널에서 실행될 때 반환되는 값입니다. 파이썬 3에서는 sys.stdout.write문자열의 길이를 print반환 하지만 그냥 반환None .

예를 들어, 터미널에서 대화식으로 다음 코드를 실행하면 대화식으로 실행될 때 길이가 반환되고 출력되므로 문자열 다음에 길이가 인쇄됩니다.

>>> sys.stdout.write(" hi ")
 hi 4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.