C 스레드에서 파일 구문 분석을 깨지 않고 내장 된 파이썬에서 locale.setLocale 사용

StackOverflow https://stackoverflow.com/questions/140295

문제

우리는 내장 된 Python 통역사에 코드를 작성할 수있는 타사 미들웨어 제품을 사용하고 있으며 호출 할 수있는 API를 노출시킵니다. 이러한 API 호출 중 일부를 사용하면 다양한 종류의 파일을로드 할 수 있으며로드 코드는 C에서 구현됩니다. 파일로드는 별도의 스레드에서 발생하며 데이터를 사용할 수 있으면 Python으로 다시 호출됩니다. 지금까지, 모두 잘하고 댄디.

우리는 I14ING (HEH) 제품을 사용했으며, 우리가하고 싶은 한 가지는 사용자의 로케일 설정에 따라 사용자를 향한 숫자 출력 형식입니다. 따라서 Python에서 우리는 다음을 수행합니다.

import locale
locale.setLocale( locale.LC_ALL, '' )

이제 이것은 작동합니다 (사용자를위한 숫자는 로케일에 대해 올바르게 형식화되어 있음). 그러나 사용자의 로케일이 기본 C 로케일과 다른 경우, 그 후로드 된 파일은 잘못된 데이터를 반환 할 것입니다.

로케일 인식 파일로드를 구현 하여이 문제를 해결할 수 없으므로 현재 해결 방법은 사용자의 출력을 형식화 할 때만 로케일 만 설정 한 다음 다시 다시 설정하는 것입니다. 즉, 다음과 같습니다.

import locale
currentLocale = locale.getLocale( locale.LC_ALL )
locale.setLocale( locale.LC_ALL, '' )
displayNumbersToTheUser()
locale.setlocale( locale.LC_ALL, currentLocale )

이것은 약간 어리석은 것처럼 보이며, 이것이 사용자의 로케일 인식 출력을 포맷하는 일반적인 접근법인지 궁금합니다. 내 다른 관심사는 이것이 스레드 안전하지 않다는 것입니다. 따라서 로케일이 변경 될 때 파일 구문 분석이 별도의 스레드에서 발생하는 경우에도 여전히 문제가 발생할 것입니다.

모범 사례에 대한 정보는 감사합니다. 이런 종류의 경험이 많지 않습니다.

도움이 되었습니까?

해결책

여러 스레드가 작동을 시작한 후 로케일을 설정하면 예상치 못한 결과가있을 수 있습니다. 더 미묘한 접근 방식을 알아낼 수 없다면 파일로드와 사용자 인터페이스를 파이프 또는 파일 소켓을 통해 통신하는 별도의 프로세스로 분할했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top