Utilizzo di locale.setlocale in Python incorporato senza interrompere l'analisi dei file nel thread C.

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

Domanda

Stiamo utilizzando un prodotto middleware di terze parti che ci consente di scrivere codice in un interprete Python incorporato e che espone un'API a cui possiamo chiamare. Alcune di queste chiamate API ci consentono di caricare vari tipi di file e il codice di caricamento è implementato in C. Il caricamento dei file avviene in un thread separato e richiama in Python quando i dati sono disponibili. Finora tutto bene e dandy.

Siamo stati i14ing (heh) del nostro prodotto e una cosa che vorremmo fare è formattare l'output numerico rivolto all'utente in base alle impostazioni locali dell'utente. Quindi, da Python, facciamo questo:

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

Ora funziona (nel senso che i numeri rivolti all'utente sono formattati correttamente per la loro locale). Tuttavia, se la locale dell'utente differisce dalla locale C predefinita, tutti i file che verranno successivamente caricati restituiranno dati errati, presumibilmente perché la conversione da stringa a float è stata influenzata, fino al metal.

Non possiamo aggirare questo problema implementando il caricamento di file con riconoscimento delle impostazioni locali, quindi la nostra soluzione alternativa consiste nell'impostare le impostazioni locali solo durante la formattazione dell'output per l'utente, quindi ripristinarle in seguito. Cioè, qualcosa del tipo:

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

Sembra un po 'goffo e mi chiedevo se questo è un approccio comune per la formattazione dell'output compatibile con le impostazioni locali per l'utente? L'altra mia preoccupazione è che questo ovviamente non è sicuro per i thread, quindi presumibilmente avremo ancora problemi se qualsiasi analisi dei file si verifica in un thread separato quando le impostazioni internazionali vengono modificate.

Qualsiasi informazione sulle migliori pratiche è apprezzata - non ho molta esperienza con questo genere di cose.

È stato utile?

Soluzione

L'impostazione della locale dopo l'avvio di più thread potrebbe avere risultati imprevisti. A meno che non riuscissi a capire un approccio più sottile, probabilmente avrei semplicemente diviso il caricamento dei file e l'interfaccia utente in processi separati, comunicando attraverso una pipe o un socket di file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top