Использование locale.setlocale во встроенном Python без прерывания анализа файла в потоке C - PullRequest
2 голосов
/ 26 сентября 2008

Мы используем сторонний промежуточный продукт, который позволяет нам писать код во встроенном интерпретаторе Python и который предоставляет API, к которому мы можем обращаться. Некоторые из этих вызовов API позволяют нам загружать различные типы файлов, а код загрузки реализован на языке C. Загрузка файлов происходит в отдельном потоке, и при наличии данных происходит обратный вызов в Python. Пока все хорошо и модно.

Мы использовали i14ing (хех) для нашего продукта, и нам хотелось бы отформатировать числовой вывод, ориентированный на пользователя, в соответствии с настройками языкового стандарта пользователя. Итак, из 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 )

Это кажется немного неуклюжим, и мне было интересно, является ли это обычным подходом к форматированию вывода с учетом локали для пользователя? Моя другая проблема заключается в том, что это, очевидно, не является потокобезопасным, поэтому, по-видимому, мы по-прежнему будем сталкиваться с проблемами, если при изменении локали какой-либо файл будет выполняться в отдельном потоке.

Любая информация о наилучшей практике приветствуется - у меня нет большого опыта в подобных вещах.

1 Ответ

1 голос
/ 27 сентября 2008

Установка локали после запуска нескольких потоков может привести к непредвиденным результатам. Если бы я не смог придумать более тонкий подход, я бы, вероятно, просто разделил загрузку файлов и пользовательский интерфейс на отдельные процессы, взаимодействующие через канал или файловый сокет.

...