GOOGLE ADS

mercredi 20 avril 2022

Python setlocale avec une chaîne vide (paramètres régionaux par défaut) donne "un paramètre de paramètres régionaux non pris en charge"

J'obtiens l'erreur suivante :

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
Traceback (most recent call last):
...
locale.Error: unsupported locale setting

La configuration est un système Fedora 34 nouvellement installé et mis à jour avec Python 3.9.6. L'erreur se produit lors de l'exécution de Lutris, ainsi que lors de la saisie des commandes dans IDLE. Voici la trace exacte de Lutris :

lutris:33:<module>:BrokenPipeError: [Errno 32] Broken pipe
Traceback (most recent call last):
File "/usr/bin/lutris", line 31, in <module>
locale.setlocale(locale.LC_ALL, "")
File "/usr/lib64/python3.9/locale.py", line 610, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/lutris", line 33, in <module>
sys.stderr.write("Unsupported locale setting. Fix your locales\n")
BrokenPipeError: [Errno 32] Broken pipe

Étant donné que, selon la documentation Python, " Une chaîne vide spécifie les paramètres par défaut de l'utilisateur ", j'ai pensé que mes paramètres régionaux par défaut ( en_AU.UTF-8) n'étaient peut-être pas pris en charge à un certain niveau de la pile. Mais les suivants fonctionnent tous bien:

>>> locale.getdefaultlocale()
('en_AU', 'UTF-8')
>>> locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
'en_AU.UTF-8'
>>> locale.setlocale(locale.LC_ALL, 'en_AU.UTF-8')
'en_AU.UTF-8'

Et curieusement, l'erreur ne se produit pas lorsque je cours pythondans un terminal et que j'y tape les commandes !

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'LC_CTYPE=en_AU.UTF-8;LC_NUMERIC=en_AU.UTF-8;LC_TIME=C.UTF-8;LC_COLLATE=en_AU.UTF-8;LC_MONETARY=en_AU.UTF-8;LC_MESSAGES=en_AU.UTF-8;LC_PAPER=en_AU.UTF-8;LC_NAME=en_AU.UTF-8;LC_ADDRESS=en_AU.UTF-8;LC_TELEPHONE=en_AU.UTF-8;LC_MEASUREMENT=en_AU.UTF-8;LC_IDENTIFICATION=en_AU.UTF-8'

Je n'ai donc aucune idée de ce que Python pense que les paramètres régionaux sont définis lorsque j'exécute IDLE ou Lutris à partir du bureau, mais ce n'est évidemment pas le même que celui défini lorsque j'utilise le terminal. Comment puis-je déboguer cette erreur ?

(Incidemment, l'exécution de Lutris à partir de la ligne de commande a été une solution de contournement réussie.)


Solution du problème

Le problème est la variable d'environnement LC_TIME. Apparemment, je l'ai réglé sur en_150.UTF-8le bureau, mais sur C.UTF-8le terminal.

Le commentaire de Cimbali m'a mis sur la bonne voie. J'ai regardé les variables d'environnement en utilisantos.environ de, dans IDLE-started-from-the-desktop et Python-started-from-the-terminal.

Ceux qui semblaient liés aux paramètres régionaux étaient LANG, LANGUAGEet LC_TIME. Les deux premiers étaient les mêmes entre les deux cas, mais le dernier différait.

Et cela a fait disparaître l'erreur:

>>> os.environ['LC_TIME'] = 'C.UTF-8'
>>> locale.setlocale(locale.LC_ALL, '')

Ce qui me laisse juste me demander, qu'est-ce que c'est en_150? Est-ce parce que mon bureau est réglé sur 24 heures plutôt que sur la valeur par défaut ? (Je me demande également si un rapport de bogue/demande de messages d'erreur plus descriptifs serait utile pour Python.)

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...