[python] 파이썬에서 stderr로 인쇄하는 방법?

stderr에 쓰는 몇 가지 방법이 있습니다.

# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

그것은 zen의 Python # 13 과 모순되는 것 같습니다. 여기서 차이점은 무엇이며 어떤 방법 으로든 장단점이 있습니까? 어떤 방법을 사용해야합니까?

명백한 방법이 있어야합니다.



답변

나는 이것이 유일하게 짧은 + 유연 + 휴대용 + 읽기 가능하다는 것을 알았습니다.

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

이 기능 eprint은 표준 print기능 과 동일한 방식으로 사용할 수 있습니다 .

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz


답변

import sys
sys.stderr.write()

내 선택, 더 읽기 쉽고 정확하게 당신이하려는 일과 버전간에 이식 가능하다는 것을 말하십시오.

편집 : ‘pythonic’이라는 것은 가독성과 성능에 대한 세 번째 생각입니다 …이 두 가지를 염두에두고 파이썬을 사용하면 코드의 80 %가 파이썬입니다. 목록 이해력은 자주 사용되지 않는 (가독성) ‘큰 것’입니다.


답변

print >> sys.stderrPython3에서 사라졌습니다.
http://docs.python.org/3.0/whatsnew/3.0.html 말한다 :

Old: print >> sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

우리 중 많은 사람들에게, 목적지를 지휘의 끝까지 이끄는 것은 다소 부자연 스럽습니다. 대안

sys.stderr.write("fatal error\n")

더 객체 지향적이며 일반에서 특정으로 우아하게 이동합니다. 그러나 write이는 1 : 1 대체품이 아닙니다 print.


답변

logging아직 언급 한 사람 은 없지만 오류 메시지를 전달하기 위해 로깅이 특별히 생성되었습니다. 기본 구성은 stderr에 쓰는 스트림 핸들러를 설정합니다.

이 스크립트는 :

# foo.py
import logging

logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')
print('hello world')

명령 행에서 실행할 때 다음과 같은 결과가 나타납니다.

$ python3 foo.py > bar.txt
I print to stderr by default

bar.txt라는이 표준 출력에 인쇄 된 ‘안녕하세요 세계’가 포함됩니다.


답변

들어 파이썬이 내 선택이 될 것입니다 :
print >> sys.stderr, 'spam'
당신은 단순히 문자열로 변환이없이 등 목록 / dicts을 인쇄 할 수 있기 때문에.
print >> sys.stderr, {'spam': 'spam'}
대신에:
sys.stderr.write(str({'spam': 'spam'}))


답변

파이썬 3을 사용하여 다음을 수행했습니다.

from sys import stderr

def print_err(*args, **kwargs):
    print(*args, file=stderr, **kwargs)

이제 캐리지 리턴을 피하기 위해 키워드 인수를 추가 할 수 있습니다.

print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")


답변

첫 번째 접근 방식은 다음과 같습니다.

print >> sys.stderr, 'spam' 

은 “한…입니다 분명 이 할 수있는 방법”다른 사람은 규칙 # 1 만족하지 않는 ( “아름다운 더 추한 이상입니다.”)