Python 3에서 sys.stdout 인코딩을 설정하는 방법은 무엇입니까?
Python 2에서 기본 출력 인코딩을 설정하는 것은 잘 알려진 관용구입니다.
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
sys.stdout
출력을 UTF-8로 인코딩하는 코덱 작성기에서 개체를 래핑합니다 .
그러나이 기술 sys.stdout.write()
은를 예상 하기 때문에 Python 3에서 작동하지 않지만 str
인코딩 결과는이고 인코딩 된 바이트를 원본에 쓰려고하면 bytes
오류가 발생합니다 .codecs
sys.stdout
Python 3에서 올바른 방법은 무엇입니까?
Python 3.7부터 다음을 사용하여 표준 스트림의 인코딩을 변경할 수 있습니다 reconfigure()
.
sys.stdout.reconfigure(encoding='utf-8')
errors
매개 변수 를 추가하여 인코딩 오류를 처리하는 방법을 수정할 수도 있습니다 .
Python 3.1이 추가 io.TextIOBase.detach()
되었으며 다음에 대한 문서에 메모가 있습니다 sys.stdout
.
표준 스트림은 기본적으로 텍스트 모드입니다. 이진 데이터를 쓰거나 읽으려면 기본 이진 버퍼를 사용하십시오. 예를 들어에 바이트를 쓰
stdout
려면sys.stdout.buffer.write(b'abc')
.io.TextIOBase.detach()
스트림을 사용하면 기본적으로 바이너리로 만들 수 있습니다. 이 함수는stdin
및stdout
바이너리로 설정 됩니다.def make_streams_binary(): sys.stdin = sys.stdin.detach() sys.stdout = sys.stdout.detach()
따라서 Python 3.1 이상에 해당하는 관용구는 다음과 같습니다.
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
동일한 오류에 대한 솔루션을 검색하는 동안이 스레드를 찾았습니다.
이미 제안 된 대안에 대한 대안은 Python이 시작 되기 전에PYTHONIOENCODING
환경 변수 를 설정하는 것입니다. 이것은 Python이 초기화 된 후 교체하는 것보다 문제가 적습니다 .sys.stdout
PYTHONIOENCODING=utf-8:surrogateescape python3 somescript.py
파이썬 코드를 편집 할 필요가 없다는 장점이 있습니다.
다른 대답은 사용을 권장하는 것 codecs
,하지만 open
나를 위해 작동합니다 :
import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)
print("日本語")
# Also works with other methods of writing to stdout:
sys.stdout.write("日本語\n")
sys.stdout.buffer.write("日本語\n".encode())
이것은 PYTHONIOENCODING="ascii"
.
Python 2에서 기본 출력 인코딩을 설정하는 것은 잘 알려진 관용구입니다.
Eek! 파이썬 2에서 잘 알려진 관용구입니까? 나에게는 위험한 실수처럼 보입니다.
바이너리를 stdout에 쓰려고하는 모든 스크립트를 엉망으로 만들 것입니다 (예를 들어 이미지를 반환하는 CGI 스크립트 인 경우 필요합니다). 바이트와 문자는 완전히 다른 동물입니다. 문자 만받는 바이트를 허용하도록 지정된 인터페이스를 원숭이 패치하는 것은 좋지 않습니다.
일반적으로 CGI와 HTTP는 명시 적으로 바이트로 작동합니다. sys.stdout으로 만 바이트를 보내야합니다. Python 3에서는 sys.stdout.buffer.write
바이트를 직접 보내는 데 사용하는 것을 의미 합니다. charset
매개 변수 와 일치하도록 페이지 콘텐츠를 인코딩 하는 것은 애플리케이션에서 더 높은 수준에서 처리해야합니다 (바이너리가 아닌 텍스트 콘텐츠를 반환하는 경우). 이것은 또한 print
더 이상 CGI에 좋지 않다는 것을 의미 합니다.
(혼란을 더하기 위해, wsgiref의 CGIHandler는 최근까지 py3k에서 깨져서 WSGI를 CGI에 배포하는 것이 불가능했습니다. PEP 3333 및 Python 3.2에서는 이것이 마침내 가능합니다.)
using을 사용 detach()
하면 인터프리터가 종료 직전에 stdout을 닫으려고 할 때 경고를 출력합니다.
Exception ignored in: <_io.TextIOWrapper mode='w' encoding='UTF-8'>
ValueError: underlying buffer has been detached
대신 이것은 나를 위해 잘 작동했습니다.
default_out = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
(물론 default_out
stdout 대신 쓰기 .)
sys.stdout is in text mode in Python 3. Hence you write unicode to it directly, and the idiom for Python 2 is no longer needed.
Where this would fail in Python 2:
>>> import sys
>>> sys.stdout.write(u"ûnicöde")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfb' in position 0: ordinal not in range(128)
However, it works just dandy in Python 3:
>>> import sys
>>> sys.stdout.write("Ûnicöde")
Ûnicöde7
Now if your Python doesn't know what your stdouts encoding actually is, that's a different problem, most likely in the build of the Python.
ReferenceURL : https://stackoverflow.com/questions/4374455/how-to-set-sys-stdout-encoding-in-python-3
'IT박스' 카테고리의 다른 글
여러 레코드를 삽입하고 ID 값을 얻는 방법은 무엇입니까? (0) | 2021.01.10 |
---|---|
스크립트를 실행하여 ipython 시작 (0) | 2021.01.10 |
django.forms에 TextField가 없습니다. (0) | 2021.01.10 |
Windows 7 Git Bash에서 현재 위치에서 디렉터리를 탐색하는 방법이 있습니까? (0) | 2021.01.09 |
화면 키보드를 닫으려면 어떻게합니까? (0) | 2021.01.09 |