2008-09-26 6 views
2

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

Мы были 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) 

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

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

+0

Я не уверен, что понимаю, в чем проблема. Как именно пользовательский язык привязан к вашим приложениям для загрузки файлов? Как вы преобразовываете строку в float в C? – nosklo

+0

Извините, что я никогда не видел вашего комментария; установка локали с LC_ALL влияет на strtof() и т. д., поэтому число «10.0» может быть интерпретировано, например, как «100». – kranzky

ответ

1

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

+0

Да, и мы, очевидно, не можем установить языковой стандарт до того, как потоки начали работать, поскольку он изменяет процесс обработки данных, которые они загружают из файлов. Кажется, для нас нет решения, кроме написания собственного кода для отображения корректно отформатированных номеров пользователю. Спасибо, в любом случае! – kranzky