Python에서 stderr로 인쇄하려면 어떻게 해야 하나요?
stderr에 쓰는 방법에는 몇 가지가 있습니다.
print >> sys.stderr, "spam" # Python 2 only.
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
이들 방법의 차이점은 무엇입니까?어떤 방법이 더 좋습니까?
짧고 유연하며 휴대성과 가독성이 뛰어난 것은 이것뿐이었습니다.
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()
제가 선택할 수 있는 것은, 보다 읽기 쉽고, 무엇을 하고 싶은지 정확하게 말하고, 버전에 관계없이 휴대할 수 있는 것입니다.
편집: '피토닉'은 가독성과 퍼포먼스에 대한 세 번째 고민입니다.이 두 가지를 염두에 두면 파이톤 코드의 80%가 피톤 코드로 되어 있습니다.목록 이해는 자주 사용되지 않는 '큰 것'입니다(가독성).
Python 3:
print("fatal error", file=sys.stderr)
Python 2:
print >> sys.stderr, "fatal error"
장답
print >> sys.stderrPython3에서는 사라졌습니다.http://docs.python.org/3.0/whatsnew/3.0.html은 다음과 같이 기술하고 있습니다.
: 식: :
print >> sys.stderr, "fatal error"
: ★★★★★★★★★★★★print("fatal error", file=sys.stderr)
많은 사람들에게 목적지를 명령어의 끝으로 강등하는 것은 다소 부자연스러운 느낌입니다.또 다른 방법
sys.stderr.write("fatal error\n")
보다 객체 지향적이고 우아하게 일반적인 것에서 구체적인 것으로 변화합니다., 단, 단, 단, 단, 단, 단, 단, 단, 단, 단, 단, 단, 주의하세요.write는, 「1 대 1」의1 대 1이 아닙니다.print.
아직 아무도 언급되지 않았지만 로그는 오류 메시지를 전달하기 위해 특별히 생성되었습니다.기본 구성에서 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
및 바.txt에는 stdout에 인쇄된 'hello world'가 포함됩니다.
Python 2의 경우 다음 중 하나를 선택합니다.print >> sys.stderr, 'spam'리스트/딕트 등을 문자열로 변환하지 않고 간단하게 인쇄할 수 있기 때문입니다. print >> sys.stderr, {'spam': 'spam'} 음음음:sys.stderr.write(str({'spam': 'spam'}))
첫 번째 접근법은 다음과 같습니다.
print >> sys.stderr, 'spam'
다른 사람들은 규칙 1('아름다운 것이 못생긴 것보다 낫다')을 만족시키지 못한다.")
-- 2020년 편집 --
위는 2011년 Python 2.7에 대한 저의 답변입니다.Python 3가 표준이기 때문에 "올바른" 답은 다음과 같습니다.
print("spam", file=sys.stderr)
Python 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")
Python 3에서는 print()만 사용할 수 있습니다.
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
개봉 즉시 사용 가능:
import sys
print("Hello, world!", file=sys.stderr)
또는 다음과 같이 입력합니다.
from sys import stderr
print("Hello, world!", file=stderr)
에, 이 에는 아무것도 넣을 필요가 없습니다.sys.stderr.
이것은 표준 인쇄 기능을 모방하지만 stderr의 출력을 모방합니다.
def print_err(*args):
sys.stderr.write(' '.join(map(str,args)) + '\n')
편집 나중에 생각해 보면, sys.stderr 변경과 동작 갱신을 볼 수 없는 혼란으로 인해 이 답변은 다른 사람들이 지적한 것처럼 단순한 함수를 사용하는 것만으로는 충분하지 않다고 생각합니다.
partial을 사용하면 코드 한 줄만 저장됩니다.혼란을 일으킬 수 있는 코드 한 줄을 저장할 가치가 없습니다.
원래의
한층 더 알기 쉽게 하기 위해서, 포장 기능에 큰 도움이 되는 「부분」을 사용한 버전이 있습니다.
from __future__ import print_function
import sys
from functools import partial
error = partial(print, file=sys.stderr)
그럼 이렇게 쓰는 거야
error('An error occured!')
다음의 조작을 실시하면, stderr 로 인쇄되고 있는 것을 확인할 수 있습니다(http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and.html) 로부터 코드 오버랩).
# over-ride stderr to prove that this function works.
class NullDevice():
def write(self, s):
pass
sys.stderr = NullDevice()
# we must import print error AFTER we've removed the null device because
# it has been assigned and will not be re-evaluated.
# assume error function is in print_error.py
from print_error import error
# no message should be printed
error("You won't see this error!")
이 문제의 단점은 작성 시 랩된 함수에 sys.stderr 값을 부분적으로 할당한다는 것입니다.즉, 나중에 stderr를 리다이렉트해도 이 기능에 영향을 주지 않습니다.stderr를 리다이렉트 할 예정이라면 이 페이지의 anaguirer에 기재되어 있는**kwargs 메서드를 사용합니다.
stdout에도 동일하게 적용됩니다.
print 'spam'
sys.stdout.write('spam\n')
다른 답변에서 설명한 바와 같이 인쇄는 디버깅 정보를 인쇄하는 등 매우 편리한 인터페이스를 제공하는 반면, 쓰기는 더 빠르고 출력을 정확하게 포맷해야 하는 경우에도 더 편리합니다.유지 보수성도 고려하겠습니다.
나중에 stdout/stderr과 일반 파일 간에 전환할 수 있습니다.
print() 구문은 Python 3에서 변경되었으므로 두 버전을 모두 지원해야 하는 경우 write()가 더 나을 수 있습니다.
저는 python 3.4.3에서 일하고 있습니다.내가 어떻게 여기 왔는지 보여주는 타이핑을 오려내고 있다.
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ python3
>>> import sys
>>> print("testing", file=sys.stderr)
testing
>>>
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$
효과가 있던가요?stderr를 파일로 리디렉션하여 어떻게 되는지 확인합니다.
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ python3 2> /tmp/test.txt
>>> import sys
>>> print("testing", file=sys.stderr)
>>> [18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ cat /tmp/test.txt
Python 3.4.3 (default, May 5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
testing
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
음, 비단뱀이 당신에게 제공하는 작은 소개가 stderr에 슬러브 되어 있다는 사실 말고도, 그것은 효과가 있다.
치명적인 오류로 인해 프로그램을 종료하려면 다음을 사용합니다.
sys.exit("Your program caused a fatal error. ... description ...")
★★★★★★★★★★★★★★★★★」import sys를 참조해 주세요.
간단한 테스트를 수행하는 경우:
import time
import sys
def run1(runs):
x = 0
cur = time.time()
while x < runs:
x += 1
print >> sys.stderr, 'X'
elapsed = (time.time()-cur)
return elapsed
def run2(runs):
x = 0
cur = time.time()
while x < runs:
x += 1
sys.stderr.write('X\n')
sys.stderr.flush()
elapsed = (time.time()-cur)
return elapsed
def compare(runs):
sum1, sum2 = 0, 0
x = 0
while x < runs:
x += 1
sum1 += run1(runs)
sum2 += run2(runs)
return sum1, sum2
if __name__ == '__main__':
s1, s2 = compare(1000)
print "Using (print >> sys.stderr, 'X'): %s" %(s1)
print "Using (sys.stderr.write('X'),sys.stderr.flush()):%s" %(s2)
print "Ratio: %f" %(float(s1) / float(s2))
sys.stderr.write()가 일관되게 1.81배 빠르다는 것을 알 수 있습니다.
질문에 대한 답변은 다음과 같습니다.python에서 stderr을 인쇄하는 방법은 다양하지만 1) 사용하는 python 버전에 따라 다릅니다. 2) 정확한 출력이 필요합니다.
print와 stderr의 write 함수의 차이: stderr : stderr (표준 에러)는 모든 UNIX/Linux 시스템에 내장된 파이프입니다. 프로그램이 크래쉬하여 디버깅 정보를 출력할 때(Python의 트레이스백과 같이), stderr 파이프에 도달합니다.
print: print는 입력을 포맷하는 래퍼입니다(입력 내용은 인수와 끝 줄 사이의 공간). 그런 다음 지정된 개체의 쓰기 함수를 호출합니다. 기본적으로 지정된 개체는 sys.stdout이지만 파일을 전달할 수 있습니다. 즉, 파일에서도 입력을 인쇄할 수 있습니다.
Python2:python2를 사용하는 경우
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
Python3에서는 Python2 trailing coma가 파라미터가 되었으므로 인쇄 후 줄바꿈을 피하기 위해 후행 콤마를 사용하면 Python3에서는 print('Text to print', end=')처럼 보이며 Python2에서는 구문 오류가 발생합니다.
http://python3porting.com/noconv.html
python3에서 위의 sceario를 체크하는 경우:
>>> import sys
>>> print("hi")
hi
Python 2.6에서는 향후 인쇄를 함수로 만들기 위한 Import가 있습니다.따라서 구문 오류 및 기타 차이를 피하기 위해 print()를 사용하는 모든 파일을 미래의 import print_function에서 시작해야 합니다.향후 Import는 Python 2.6 이후에서만 동작하므로 Python 2.5 이전 버전에서는 두 가지 옵션이 있습니다.보다 복잡한 인쇄를 심플한 것으로 변환할 수도 있고, Python2와 Python3 양쪽에서 동작하는 별도의 인쇄 기능을 사용할 수도 있습니다.
>>> from __future__ import print_function
>>>
>>> def printex(*args, **kwargs):
... print(*args, file=sys.stderr, **kwargs)
...
>>> printex("hii")
hii
>>>
케이스: sys.stderr.write() 또는 sys.stdout 에 주의해 주세요.write() ( stdout (표준 출력)는 모든 UNIX/Linux 시스템에 내장된 파이프입니다)는 인쇄를 대체하는 것은 아니지만 경우에 따라서는 사용할 수 있습니다.인쇄는 입력의 끝을 공백과 줄바꿈으로 감싸고 쓰기 기능을 사용하여 쓰는 래퍼입니다.이것이 sys.stderr.write()가 더 빠른 이유입니다.
주의: Logging을 사용하여 추적 및 디버깅할 수도 있습니다.
#test.py
import logging
logging.info('This is the existing protocol.')
FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning("Protocol problem: %s", "connection reset", extra=d)
https://docs.python.org/2/library/logging.html#logger-objects
그냥 재미삼아 하는 건데 다른 방법이 있어... :-)
message = 'error: Belly up!!'
print(message, file=sys.stderr if 'error' in message.lower() else sys.stdout)
다른 방법
import sys
print("{}".format(sys.exec_info()[1], file=sys.stderr)
언급URL : https://stackoverflow.com/questions/5574702/how-do-i-print-to-stderr-in-python
'programing' 카테고리의 다른 글
| SED가 모든 항목을 대체하지 못하는 이유는 무엇입니까? (0) | 2023.04.18 |
|---|---|
| 마이크로소프트(MS.Office.Interop.엑셀은 매우 느리다. (0) | 2023.04.18 |
| 호출 필터가 반환됨 (0) | 2023.04.13 |
| Resharper가 설치되어 있는 Visual Studio에서는 키보드 단축키가 활성화되지 않습니다. (0) | 2023.04.13 |
| Openpyxl에서 스타일 설정 (0) | 2023.04.13 |