Programming

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

procodes 2020. 3. 4. 07:50
반응형

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


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

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


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

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

그래서

print 99

다음과 같습니다.

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

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

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

sys.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()하는 것이 바람직하다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:패턴을 사용할 수 없다는 것을 의미 하지만 때로는 그만한 가치가 있습니다.


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

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에서 최종 \ n을 잃어 버립니다 (윙 프로 IDE 사용).

문자열에서 \ 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.


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

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

위의 예를 관찰하십시오.

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

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

우리가 깊이 잠수하면

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

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


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

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

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

참고 URL : https://stackoverflow.com/questions/3263672/the-difference-between-sys-stdout-write-and-print



반응형