Question

Je dois obtenir les paramètres régionaux du système pour effectuer un certain nombre de tâches. Je souhaite enfin traduire mon application à l'aide de gettext. Je vais le distribuer sous Linux et OSX, mais des problèmes se sont posés sous OSX Snow Leopard:

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)

Les deux systèmes utilisent le suédois. Sous Linux, la variable d'environnement LANG est déjà définie sur "sv_SE.UTF-8". Si je transmets cette variable à python sous OSX ( LANG = "sv_SE.UTF-8" python à la place), les paramètres régionaux sont bien détectés. Mais locale.getlocale () ne devrait-il pas être en mesure d'extraire la langue du système d'exploitation? Je ne veux pas forcer les utilisateurs à définir LANG , LC_ALL ou toute autre variable d'environnement.

Sortie de la commande locale :

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
Était-ce utile?

La solution

Impair sous OSX (Smow Leopard 10.6.1), je reçois

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

Modifier:

Je viens de le trouver sur la liste de diffusion Apple Python

Cela dépend fondamentalement de ce qui est défini dans votre environnement au moment de l'exécution (l'un de LANG, LANGUAGE, LC_ALL). J'avais LANG = en_GB.UTF-8 dans mon environnement de shell

Autres conseils

Certes, un horrible hack, mais j'ai inséré ceci:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

à un stade précoce d'un programme de mine . Après cela, je pourrais exécuter mon programme en utilisant un environnement shell non modifié sur tous les systèmes d’exploitation qui me concernaient (mon programme détermine quand même le langage à utiliser dans son traitement).

On dirait que vous pouvez modifier les paramètres régionaux en modifiant la variable d'environnement LC_ALL .

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

De ici : essayez d'ajouter ou de modifier le ~ / .profile ou . ~ / .bash_profile pour qu’il exporte correctement vos paramètres régionaux lors du lancement d’une nouvelle session.

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

Ancienne question, mais cela pourrait aider les autres: il s'agit d'un bogue Python non résolu en mars 2016 dans Python 2 ou 3: https://bugs.python.org/issue18378 .

En résumé, Python considère que les paramètres régionaux et les balks de type GNU sont identiques à ceux utilisés dans les environnements BSD (comme OS X). Et la locale UTF8 existe dans BSD, pas sous Linux, d’où le problème.

En ce qui concerne les solutions ou le débogage: les variables d’environnement local peuvent être définies par Terminal.app (voir Préférences - Profils - Avancé - International; il en va de même pour iTerm ou autre). On peut donc trouver les variables d’environnement locales définies dans une fenêtre de terminal, mais les variables NON définies lors de l’exécution d’une application empaquetée.

Dans certains cas (comme Sphinx dans Python 2.7 et 3.5 qui mourait sous OS X à cause de "ValueError: locale inconnue: UTF-8"), la solution était de désactiver la case à cocher des préférences pour définir des variables d'environnement locales.

Mais cela peut poser problème dans d’autres programmes: si les paramètres régionaux ne sont pas définis, bash 4.3 (de MacPorts) se plaindra à chaque invite avec le message "warning: setlocale: LC_CTYPE: impossible de modifier les paramètres régionaux (): ce type de fichier ou répertoire " ...

Donc, étant donné que le bogue est en Python, la solution de contournement devrait probablement être effectuée dans le programme python (comme dans la réponse de @Jacob Oscarson) ou dans l'invocation python (en définissant les paramètres régionaux par une valeur adéquate).

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