2008-09-26 10 views
2

私たちは組み込みPythonインタプリタでコードを書くことができ、呼び出し可能なAPIを公開するサードパーティのミドルウェア製品を使用しています。これらのAPI呼び出しの中には、さまざまな種類のファイルを読み込むことができ、読み込みコードはCで実装されています。ファイル読み込みは別のスレッドで行われ、データが利用可能なときにPythonにコールバックします。これまでのところ、すべてうまくやっている。埋め込みPythonでのlocale.setlocaleの使用Cのスレッドでのファイル解析を中断することなく

私たちは私たちの製品をi14しています。ユーザーのロケール設定に応じて、ユーザーに面する数値出力をフォーマットします。だから、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

私は何が問題なのか分かりません。ユーザーのロケールがファイルをロードするアプリケーションの機能にどの程度忠実であるかどのようにCで文字列を浮動小数点に変換していますか? – nosklo

+0

申し訳ありませんが、あなたのコメントは見たことがありません。ロケールをLC_ALLで設定するとstrtof()などに影響しますので、数字「10.0」は「100」と解釈されます。 – kranzky

答えて

1

複数のスレッドが操作を開始した後にロケールを設定すると、予期しない結果が生じることがあります。より微妙なアプローチが見つからない限り、私はたぶんファイルローディングとユーザーインターフェイスを別々のプロセスに分割し、パイプやファイルソケットを介して通信するだけです。

+0

はい、スレッドから開始される前にロケールを設定することはできません。ファイルからロードするデータを処理する方法が変更されるためです。正しいフォーマット番号をユーザに表示するための独自のコードを書くことは別として、私たちにとっては解決策がないようです。とにかくありがとう! – kranzky

関連する問題