2008-09-26 17 views
2

我们使用第三方中间件产品,它允许我们在嵌入式Python解释器中编写代码,并且公开可调用的API。其中一些API调用允许我们加载各种文件,加载代码用C实现。文件加载发生在单独的线程中,并且在数据可用时调用回Python。到目前为止,一切都很好,很棒。在嵌入式Python中使用locale.setlocale而不破坏C线程中的文件解析

我们一直在i14ing(heh)我们的产品,我们想要做的一件事是根据用户的区域设置格式化面向用户的数字输出。所以,从Python,我们这样做:

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

现在,这工作(因为面向用户的号码格式正确的他们的语言环境)。但是,如果用户的区域设置不同于默认的C区域设置,则随后加载的任何文件都将返回不正确的数据,这可能是因为所有字符串到float的转换都受到影响,直至金属。

我们无法通过执行区域感知文件加载来解决此问题,因此我们当前的解决方法是仅在为用户格式化输出时设置区域设置,然后再将其设置回去。也就是说,这样的:

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

这似乎有点笨重,我想知道这是否是格式化语言环境感知输出为用户提供公共的方法呢?我的另一个担心是,这显然不是线程安全的,因此如果在语言环境发生更改时在单独的线程中发生任何文件分析,我们可能仍然会遇到问题。

任何关于最佳实践的信息都是值得赞赏的 - 我对这类事情没有太多经验。

+0

我不知道我明白什么是问题。用户区域设置如何影响您的应用程序加载文件的能力?你如何转换字符串在C中浮动? – nosklo 2008-09-27 02:38:03

+0

对不起,我从来没有见过你的评论;例如,使用LC_ALL设置区域设置会影响strtof()等等,因此数字“10.0”可能会被解释为“100”。 – kranzky 2008-11-25 04:32:55

回答

1

在多个线程开始运行后设置语言环境可能会有意想不到的结果。除非我能找出一个更微妙的方法,否则我可能只是将文件加载和用户界面拆分为单独的进程,通过管道或文件套接字进行通信。

相关问题