在嵌入式Python中使用locale.setlocale而不中断C线程中的文件解析

时间:2020-03-06 14:47:31  来源:igfitidea点击:

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

我们一直在开发(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 )

这似乎有些笨拙,我想知道这是否是格式化用户可识别区域设置的输出的常用方法吗?我的另一个担心是,这显然不是线程安全的,因此,当更改语言环境时,如果在单独的线程中发生任何文件解析,我们可能仍然会遇到问题。

感谢我们提供有关最佳做法的任何信息,我对这类事情没有太多经验。

解决方案

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