设置Python语言环境不起作用

Jef*_*rey 7 python datetime locale

所以我一直在尝试设置Python语言环境.我想,因为我想以当地语言(使用strftime('%A'))使用工作日名称.但是目前工作日是用英语打印的,尽管我尝试过多种方式设置语言环境.我在带有Ubuntu Mate的RPi2上运行它.

我已经尝试过本主题中的解决方案在Windows上设置Python的语言环境的正确方法是什么?

我尝试将locale明确设置为nl_NL.utf8:

$> locale -a
$> python3
>>> import locale
>>> locale.setlocale(locale.LC_ALL,'nl_NL.utf-8')
Run Code Online (Sandbox Code Playgroud)

我也尝试设置一个空字符串,在最后一个答案中建议:

>>> locale.setlocale(locale.LC_ALL, '')
Run Code Online (Sandbox Code Playgroud)

在我尝试的两种情况下

>>> locale.getlocale()
Run Code Online (Sandbox Code Playgroud)

我知道了 nl_NL.utf8

但我仍然用英语获得工作日!除了上面的主题外,还没有在internetz上找到太多这方面的内容,我无法解决这个问题.


编辑:

我尝试了所有3个选项.第一个返回一个奇怪的结果:

~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale(locale.LC_TIME)
(None, None)
>>> locale.setlocale(locale.LC_TIME, 'nl_NL.utf-8')
'nl_NL.utf-8'
>>> locale.getlocale(locale.LC_TIME)
('nl_NL', 'UTF-8')
>>> exit()
jeffrey@jeffrey-desktop:~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale(locale.LC_TIME)
(None, None)
Run Code Online (Sandbox Code Playgroud)

似乎什么都没有得救.假设你设置一次你的语言环境我错了,然后系统会记住这个吗?第二种选择:

~/Documenten$ python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import calendar
>>> calendar.day_name[2]
'Wednesday'
>>> import locale
>>> locale.nl_langinfo(locale.DAY_2)
'Monday'
Run Code Online (Sandbox Code Playgroud)

即使我想获得一个荷兰人的平日名称,我仍然得到一个英文名称作为回报.除此之外,这种方法从星期日而不是星期一开始计算.我做错了吗?第三个建议给了我平日的名字,谢谢!但我仍然想知道为什么第一个不起作用?我在自己的设备上使用此脚本,并希望使用正确的全局区域设置.


EDIT2:

是的,在Python中调用locale.setlocale()不会影响将来的python进程.请改为配置环境变量,请参阅如何在Ubuntu中设置所有语言环境设置.

好!所以这就是为什么它不起作用.我假设我已经为Python中的任何未来使用设置了语言环境,比如环境变量,但仅适用于Python.

我有一个创建文件的bash脚本,这个Python脚本应该在一段时间后删除它(学习编码,在编写Bash脚本时不知道Python).Bash的"日期"方法似乎以某种方式获取区域设置.我会继续看看我能为Python修复什么.这是我输入时看到的内容$ locale:

LANG=nl_NL.UTF-8
LANGUAGE=nl:en
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 6

似乎什么都没有得救.假设你设置一次你的语言环境我错了,然后系统会记住这个

是的,locale.setlocale()用Python 调用不会影响未来的python进程.请改为配置环境变量,请参阅如何在Ubuntu中设置所有语言环境设置.

Bash的"日期"方法似乎以某种方式获取区域设置.

datesetlocale(LC_ALL, "")在开始时 调用,即每个进程至少调用setlocale()一次以启用$LANG语言环境而不是C语言环境.


setlocale(LC_ALL, '')$LANG首先根据变量设置语言环境,而不是$LANGUAGE(它是相关但不同的:"GNU gettext搜索路径按顺序包含'LC_ALL','LC_CTYPE','LANG'和'LANGUAGE'.").

设置LC_TIME类别(在Ubuntu上)就足够了:

>>> import locale
>>> import time
>>> time.strftime('%A')
'Tuesday'
>>> locale.getlocale(locale.LC_TIME)
('en_US', 'UTF-8')
>>> locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
'ru_RU.UTF-8'
>>> time.strftime('%A')
'???????'
>>> locale.getlocale(locale.LC_TIME)
('ru_RU', 'UTF-8')
Run Code Online (Sandbox Code Playgroud)

如果setlocale()尚未引发,locale.Error: unsupported locale setting则成功设置相应的区域设置类别.

您还可以获取工作日名称知道其位置(在更改语言环境的同一个python会话中):

>>> import calendar
>>> calendar.day_name[1]
'???????'
>>> locale.nl_langinfo(locale.DAY_3)
'???????'
Run Code Online (Sandbox Code Playgroud)

在不修改全局状态的情况下,在给定语言环境中打印工作日的可移植方法是使用babel模块:

>>> from datetime import date
>>> from babel.dates import format_date # $ pip install babel
>>> format_date(date.today(), format='EEEE', locale='en')
'Tuesday'
>>> format_date(date.today(), format='EEEE', locale='ru')
'???????'
>>> format_date(date.today(), format='EEEE', locale='nl')
'dinsdag'
Run Code Online (Sandbox Code Playgroud)