Utilisation de locale.setlocale dans Python intégré sans interrompre l'analyse de fichier dans le thread C

StackOverflow https://stackoverflow.com/questions/140295

Question

Nous utilisons un produit intermédiaire tiers qui nous permet d'écrire du code dans un interpréteur Python intégré et expose une API dans laquelle nous pouvons appeler. Certains de ces appels d'API nous permettent de charger différents types de fichier. Le code de chargement est implémenté en C. Le chargement de fichier s'effectue dans un thread séparé et est rappelé dans Python lorsque les données sont disponibles. Jusqu'ici, tout va bien et dandy.

Nous avons créé (heh) notre produit, et nous aimerions notamment formater la sortie numérique destinée à l'utilisateur en fonction des paramètres régionaux de l'utilisateur. Donc, à partir de Python, nous faisons ceci:

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

Maintenant, cela fonctionne (en ce que les nombres face à l'utilisateur sont formatés correctement pour leurs paramètres régionaux). Toutefois, si les paramètres régionaux de l'utilisateur diffèrent des paramètres régionaux C par défaut, tous les fichiers chargés par la suite renverront des données incorrectes, probablement du fait que toute la conversion chaîne en chaîne a été affectée, jusqu'au métal.

Nous ne pouvons pas contourner ce problème en implémentant le chargement de fichier tenant compte des paramètres régionaux. Notre solution de contournement consiste à définir uniquement les paramètres régionaux lors du formatage de la sortie pour l'utilisateur, puis à les rétablir ultérieurement. C'est-à-dire quelque chose comme:

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

Cela semble un peu maladroit, et je me demandais s’il s’agissait d’une approche courante pour formater la sortie sensible à la localisation pour l’utilisateur? Mon autre souci est que cela n’est évidemment pas sécuritaire pour les threads. Par conséquent, nous aurons probablement encore des problèmes si une analyse de fichier se produit dans un thread séparé lorsque les paramètres régionaux sont modifiés.

Toute information sur les meilleures pratiques est appréciée - je n’ai pas beaucoup d’expérience dans ce genre de choses.

Était-ce utile?

La solution

La définition des paramètres régionaux après le démarrage de plusieurs threads peut avoir des résultats inattendus. À moins que je ne trouve une approche plus subtile, je diviserais probablement le chargement de fichier et l'interface utilisateur en processus distincts, communiquant via un tuyau ou un socket de fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top