- 작성시간 : 2021/01/27 22:41
- 퍼머링크 : mcchae.egloos.com/11378575
- 덧글수 : 0
요즘에는 파이썬3을 Windows, Mac, Linux 등에 모두 사용하면서
하나의 코드로 멀티 플랫폼에 도는 것을 목표로 해 왔습니다만,
다음과 같이 특정 명령을 수행하고,
cmd = [ ... ]
po = subprocess.Popen(cmd, stdout=subprocess.PIPE)
po.wait()
out = po.stdout.read().decode('utf-8').strip()
그 결과가 파이썬3에서는 byte 로 결과가 나오므로
문자열로 바꾸기 위해서는 위의 마지막 줄 처럼 decode를 시켜야 하는데
문제는 무조건 utf-8 로 줄 수 없다는 데 있습니다.
(물론 결과에 한글이 포함되어 있다고 가정합니다)
위의 코드를 실행하면 마지막 줄에서 예외가 발생합니다.
맥과 리눅스에서는 디폴트로 UTF-8 이라 해도 괜찮지만,
한글이 설치된 윈도우10인 경우에는 cp949 로 디코딩을 시켜야
정상 동작합니다.
찾다가 아마도 크로스 플랫폼에 모두 잘 동작되는 코드를
찾은 것 같습니다. 물론 일본어 윈도우에도 잘 될 것으로 보입니다.
결론은
import locale
os_encoding = locale.getpreferredencoding()
print(os_encoding)
위와 같은 코드를 돌리면,
한글 윈도우10 에서는 "cp949" 가 결과로 나오고
Mac 에서 테스트를 했더니 "UTF-8" 이 나옵니다.
따라서 처음 코드는 다음과 같이 수정하면 안전한 코드가 됩니다.
import locale
os_encoding = locale.getpreferredencoding()
cmd = [ ... ]
po = subprocess.Popen(cmd, stdout=subprocess.PIPE)
po.wait()
out = po.stdout.read().decode(os_encoding).strip()
어느 분께는 도움이 되셨기를 ..
덧글