일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 컴퓨터과학
- 사이버보안
- 데이터구조
- 자바스크립트
- 빅데이터
- 네트워크보안
- 딥러닝
- 자료구조
- 보안
- 버전관리
- 데이터분석
- Yes
- 데이터베이스
- 컴퓨터비전
- 프로그래밍
- 데이터과학
- 인공지능
- 프로그래밍언어
- 클라우드컴퓨팅
- 알고리즘
- I'm Sorry
- 2
- 파이썬
- 소프트웨어
- 코딩
- 소프트웨어공학
- 웹개발
- 컴퓨터공학
- 머신러닝
- 네트워크
- Today
- Total
스택큐힙리스트
Python에서 stdout을 파이핑할 때 올바른 인코딩 설정하기 본문
파이썬 프로그램의 출력을 파이프로 연결하면, 파이썬 인터프리터는 인코딩에 대해 혼란스러워하고 이를 None으로 설정합니다. 이는 다음과 같은 프로그램을 의미합니다:
# -*- coding: utf-8 -*-
print uåäö
일반적으로 실행할 때 잘 작동하지만 실패합니다.
UnicodeEncodeError: 'ascii' 코덱은 위치 0의 문자 u'\xa0'을(를) 인코딩할 수 없습니다. 범위에서 벗어난 순서입니다(128 이하).
파이프 순서에서 사용될 때.
이것을 파이핑할 때 가장 좋은 방법은 무엇인가요? 쉘 / 파일 시스템 / 기타 등등이 사용하는 인코딩을 그냥 사용하도록 지정할 수 있나요?
지금까지 본 제안은 직접 사이트.py를 수정하거나 이 해킹 방법을 사용하여 defaultencoding을 하드 코딩하는 것입니다.
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print uåäö
파이프 작동을 더 잘할 수 있는 방법이 있나요?
답변 1
당신의 코드는 스크립트에서 실행될 때 작동합니다. 왜냐하면 Python은 출력을 당신의 터미널 애플리케이션이 사용하는 인코딩 방식으로 인코딩하기 때문입니다. 그러나, 만약 파이프링 중이라면 직접 인코딩해야 합니다.
규칙은 다음과 같습니다: 항상 내부적으로 유니코드를 사용하십시오. 받은 것을 디코딩하고 보내는 것을 인코딩하십시오.
# -*- coding: utf-8 -*-
print uåäö.encode('utf-8')
또 다른 교육적 예는 ISO-8859-1과 UTF-8 사이를 변환하고 그 사이의 모든 문자를 대문자로 만드는 Python 프로그램입니다.
import sys
for line in sys.stdin:
# Decode what you receive:
line = line.decode('iso8859-1')
# Work with Unicode internally:
line = line.upper()
# Encode what you send:
line = line.encode('utf-8')
sys.stdout.write(line)
시스템 기본 인코딩을 설정하는 것은 좋지 않은 아이디어입니다. 사용하는 일부 모듈과 라이브러리가 ASCII임을 전제로 작동할 수 있기 때문입니다. 하지 마십시오.
답변 2
파이썬에서 stdout을 파이프로 연결할 때 올바른 인코딩을 설정하는 방법에 대해 알아보자.우리는 일상적으로 Windows나 Mac OS, Linux와 같은 운영체제에서 컴퓨터를 사용한다. 이 운영체제들은 서로 다른 인코딩을 가지고 있는데, 이는 문자열을 컴퓨터에서 처리하기 위해 사용되는 방식을 의미한다. 따라서, 올바른 인코딩을 설정하지 않으면 문자열이 이상하게 출력될 수 있다.
파이프로 연결된 두 개의 프로그램은 각각의 인코딩을 가지고 있다. 예를 들어, 한 프로그램에서는 UTF-8을 사용하고 다른 프로그램에서는 cp949를 사용할 수 있다. 이 경우, 출력된 데이터를 올바른 형식으로 decoding하기 위해서는 두 프로그램 사이에서 적절한 인코딩을 설정해야 한다.
파이썬에서는 subprocess 모듈을 사용하여 파이프 연결을 설정할 수 있다. 이 모듈은 다양한 인코딩을 지원하며, 올바른 인코딩을 설정하기 위한 매개변수를 제공한다.
예를 들어, UTF-8로 인코딩된 한글을 출력하는 코드는 다음과 같다.
```
import subprocess
p = subprocess.Popen(['program'], stdout=subprocess.PIPE)
output, err = p.communicate()
print(output.decode('utf-8'))
```
위 코드에서는 subprocess 모듈의 Popen 함수를 사용하여 'program'이라는 프로그램을 실행하고, 출력을 파이프로 연결하여 받는다. 그리고 stdout을 decode하여 출력한다.
만약 다른 인코딩을 사용하는 프로그램을 연결하고자 한다면, decode 함수의 argument를 변경하여 적절한 인코딩을 설정할 수 있다.
결론적으로, 파이썬에서 stdout을 파이프로 연결할 때 올바른 인코딩을 설정하는 것은 매우 중요하다. subprocess 모듈을 사용하여 인코딩을 설정하면 올바른 형식으로 출력된 데이터를 얻을 수 있다.