일부 인수로 쉘 스크립트를 호출하는 Flask 애플리케이션 (Linux, mod_wsgi, Python 3이있는 Apache)이 있습니다. subprocess.run()
명령 인수에 비 ASCII 문자가있는 경우 오류를 다음하면 응용 프로그램에서 발생합니다subprocess.run() 인수 인코딩
'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
내가 그것을 해결하기 위해 노력 많은 시간을 보냈다.
명령 줄에는 문제가 존재하지 않으며 응용 프로그램에만 있습니다.
전체 응용 프로그램의 출력이 유니 코드이며 문제가 없습니다. 몇 가지 연구가 끝난 후에 나는 문제가 "파일 시스템 인코딩"에 있다고 결론을 내렸다.
내 run.wsgi
스크립트에 일부 로깅 구문을 추가했습니다. FS 인코딩은 실제로 'ascii'(그리고 명령 행에서 'utf-8')입니다.
LANG=C
시작했다이 문서
How to change file system encoding via python?
을 발견했다. /etc/sysconfig/httpd
에 경고가 있음에도 불구하고 C.UTF-8
으로 변경했습니다. 그게 도움이 안된다, FS 인코딩은 여전히 'ascii'이었다. 나는 심지어 sys.getfilesystemencoding()
에서 lambda: 'utf-8'
까지 원숭이 패치를했다. 그러나 오류는 여전히 존재합니다.
변경 될 때마다 제대로 httpd 서비스를 다시 시작했습니다.
나는 재치가있다.
- 내 문제는 실제로 FS 인코딩 때문입니까?
- 그렇다면 utf-8로 바꾸려는 시도가 실패한 이유는 무엇입니까?
- 가장 중요한 점은이 문제를 어떻게 해결할 수 있습니까?
갱신 1 :
코드 : mod_wsgi에의 맥락에서
import subprocess as sub
cmdresult = sub.run(
[SCRIPT, tid, days, name],
stdin=sub.DEVNULL, stdout=sub.PIPE, stderr=sub.DEVNULL,
encoding='ascii', # 'utf-8' will not help, this affects stdin, stdout I/O only
check=True)
'shell = True'를 사용하여 호출합니까? 인수를 문자열이나 목록으로 전달하고 있습니까? 'subprocess' 모듈을 사용하는 실제 코드를 보여주십시오. –
OS 레벨에서'exec()'와 친구들은 하위 프로세스에 전달한 인수에 어떤 인코딩을 사용했는지 상관하지 않습니다. POSIX는 C'char *'문자열로 표현할 수 있어야하며, 서브 프로세스로 보내어 디코딩합니다. –
@DanielPryden 코드가 추가되었습니다. 기본적으로'shell = False'입니다. – VPfB