내가 작동이 Python2.7 스크립트가를 포함해야하는 경우 LANG = 'C'! 리눅스 쉘에형식 오류 : execv와() 인수 2 만 문자열 (하위 프로세스 및 유니 코드)
가# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals, print_function
import os
import subprocess
import sys
print('LANG: {}'.format(os.environ['LANG']))
print('sys.getdefaultencoding(): {}'.format(sys.getdefaultencoding()))
print('sys.getfilesystemencoding(): {}'.format(sys.getfilesystemencoding()))
subprocess.check_call(['echo', 'Umlauts üöä'])
전화 :
[email protected]:~$ python src/execv-arg-2-must-contain-only-strings.py
LANG: de_DE.UTF-8
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): UTF-8
Umlauts üöä
하지만이 실패
[email protected]:~$ LANG=C python src/execv-arg-2-must-contain-only-strings.py
LANG: C
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): ANSI_X3.4-1968
Traceback (most recent call last):
File "src/execv-arg-2-must-contain-only-strings.py", line 12, in <module>
subprocess.check_call(['echo', 'Umlauts üöä'])
File "/usr/lib/python2.7/subprocess.py", line 536, in check_call
retcode = call(*popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
TypeError: execv() arg 2 must contain only strings
내가 LANG = C로 Python2.7에서이 스크립트를 작동하게하기 위해 무엇을 할 수 있는가?
이 UTF-8 (_unicode_)에 호출 인수를 디코딩 시도 :-), 다음을 인코딩 즉,'subprocess.check_call ([ 'echo', 'Umlauts üöä'.decode ("utf-8"). encode (sys.getdefaultencoding()))'기본 인코딩으로 변경합니다. 서브 프로세스/쉘이 유니 코드 환경에서 실행되지 않는 한 일반적으로 유니 코드 데이터를 인수로 전달하는 것은 좋지 않습니다. 이러한 데이터를 STDOUT 파이프를 통해 전달하는 것이 훨씬 안전합니다. – zwer
@zwer 나는 STDIN 파이프를 의미하는 것 같아. 그럼에도 불구하고, 귀하의 의견에 감사드립니다. 왜 대답으로 쓰지 않을까요? – guettli
기술적 인면에서 파이프는 호출자의 STDOUT과 calee의 STDIN 사이에 서있을 것입니다. – zwer