gpt4 book ai didi

python - 获取 Windows 上的当前区域设置

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:35 24 4
gpt4 key购买 nike

上下文

在 Windows 上使用 python 获取语言环境似乎已损坏:

(trash0) PS C:\Users\myname\venv\trash0\Lib\site-packages> python.exe
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.platform
'win32'
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'fr-FR')
'fr-FR'
>>> locale.getlocale()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python36-32\lib\locale.py", line 581, in getlocale
return _parse_localename(localename)
File "C:\Program Files\Python36-32\lib\locale.py", line 490, in _parse_localename
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: fr-FR
>>>

我对 Windows 不太了解,但我查过 fr-FR 属于 the correct locale names for Windows 。请注意,使用 en-USen-GB 会得到相同的结果。

但是设置区域设置可以正常工作,因为:

  • locale.setlocale() 与任何未知值一起使用都会引发异常:
  >>> locale.setlocale(locale.LC_ALL, 'anythingundefined')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python36-32\lib\locale.py", line 598, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>>
  • 设置后,可以检查是否已将其考虑在内:
  >>> locale.setlocale(locale.LC_ALL, 'fr-FR')
'fr-FR'
>>> locale.str(12.3)
'12,3'
>>> locale.setlocale(locale.LC_ALL, 'en-GB')
'en-GB'
>>> locale.str(12.3)
'12.3'
>>>
<小时/>

问题

我需要暂时将语言环境设置为en-US(以便执行一些需要此语言环境的操作),然后切换回默认语言环境。如果 locale.getlocale() 损坏了,怎么可能做到这一点?我读过python doc about locale但无法找出任何解决方法来实现这一目标(也不知道是否可能)。

最佳答案

以下是如何对 locale 模块进行猴子修补,正如我试图在您的问题下的评论中描述的那样。

首先是猴子修补模块,locale_patch.py​​:

""" Module that monkey-patches the locale module so it remembers the last
arguments to setlocale() that didn't raise an exception and will allow them to
be retrieved later by calling a new function named setting_values() which also
gets added.
"""
import locale as _locale

_last_category, _last_locale = None, None

def my_setlocale(category, locale=None):
global _last_category, _last_locale

try:
result = _orig_setlocale(category, locale)
except _locale.Error:
raise # Didn't work, ignore arguments.

if locale is not None: # Was a setting modified by call?
_last_category, _last_locale = category, locale # Remember args.

return result

def setting_values():
global _last_category, _last_locale

if _last_category is None:
raise _locale.Error('setlocale() has never been called to change settings')

return _last_category, _last_locale


# Monkey-patch the module.
_orig_setlocale = _locale.setlocale
_locale.setlocale = my_setlocale
_locale.setting_values = setting_values # New module function.

使用示例:

import locale
import locale_patch # Apply monkey-patch(es).

try:
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') # locale.Error: unsupported locale setting
except locale.Error:
print("locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') didn't work")
try:
print(locale.setting_values())
except locale.Error:
print("locale.setting_values() didn't work") # Expected.

try:
locale.setlocale(locale.LC_ALL, locale='fr_FR.UTF-8')
except locale.Error:
print("locale.setlocale(locale.LC_ALL, locale='fr_FR.UTF-8') didn't work")
try:
print(locale.setting_values())
except locale.Error:
print("locale.setting_values() didn't work") # Expected.

locale.setlocale(locale.LC_ALL, 'fr-FR')
results = locale.setting_values()
print(results) # -> (0, 'fr-FR') # The 0 is the numeric value of locale.LC_ALL

locale.setlocale(*results) # Works OK.

关于python - 获取 Windows 上的当前区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com