簡體   English   中英

Python 默認語言環境(不支持的語言環境設置)

[英]Python default locale (unsupported locale setting)

這似乎是一個奇怪的問題,它引起了我的一些胃灼熱,因為我正在使用一個隱藏當前語言環境的庫,並試圖將它設置回它隱藏的內容。

$ docker run --rm -it python:3.6 bash
root@bcee8785c2e1:/# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
root@bcee8785c2e1:/# locale -a
C
C.UTF-8
POSIX
root@bcee8785c2e1:/# python
Python 3.6.9 (default, Jul 13 2019, 14:51:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> curr = locale.getlocale()
>>> curr
('en_US', 'UTF-8')
>>> locale.setlocale(locale.LC_ALL, curr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/locale.py", line 598, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>>

我不確定為什么getlocale返回en_US 它不在我的環境變量中的任何地方(我不確定它可能在我的 shell 中的其他地方?)。

在任何情況下,我不能setlocale從價值getlocale ,這似乎怪我。

有人在這里有任何指導嗎?

非常感激!

第一部分:重要嗎? 據我所知,在您調用setlocale()之前,我從未發現差異,所以我們在第二部分:

你應該使用:

import locale
curr = locale.getdefaultlocale()
locale.setlocale(locale.LC_ALL, curr)

所以getdefaultlocale()而不僅僅是getlocale() 我也不完全理解兩者兼而有之的原因。 是否有可能是無法識別C.xxx的 Python 錯誤。

C.UTF-8 — 最近的不可移植 debianism

C.UTF-8 的初衷是好的,但尚未實現 現在避免,直到它穩定。

一些上下文的討論

圍繞包括它的紅帽討論。 這意味着它不完全存在(至少在撰寫本文時)。 特別要注意的是,核心 python-dev 的 Nick Coghlan 建議 python 在某些上下文中無法正確設置語言環境,例如這種情況。

一個haskell討論表明,使用 C.UTF-8 時,可移植的跨平台東西——在這種情況下是 haskell-stack,但也暗示了 docker——變得更難,更不可靠。

意向

Debian)發起了 C.UTF-8 並且意圖是正確的。

今天的 Linux 系統被高度本地化——大量的語言環境、LC_* 選項的細粒度選擇等等。但是默認情況下所有這些都不是:如果語言環境系統損壞,系統就會損壞。 損壞的語言環境系統在效果上不如說損壞的內核或 fstab 或 grub 等嚴重的原因是......

C語言環境

C 語言環境(同義詞 POSIX)保證在其他事情中斷時始終可用作后備。 因此,例如,您不會看到本地化錯誤,但會看到英語 - 不是 mojibake 或空矩形或問號!

總的來說,您會收到這些警告而不是錯誤,否則事情會繼續工作。

但是 C = POSIX 意味着所有的地方都是遺留的 ASCII 而不是UTF- 8——遺留的不良副作用。

為了使這種遺產變得越來越沒有必要,甚至作為后備,Debian 引入了始終可用的 C.UTF-8 語言環境。

漁獲? 它總是可用...

僅在 Debian 中

這意味着最近的Debian,像 Ubuntu 這樣的衍生產品也是最近的。 但不是(還)其他系統。

簡而言之,C.UTF-8 不是通用的、不可移植的、脆弱的,因此是可以避免的……至少現在,至少在客戶端-服務器、虛擬化(容器化)等系統(如 docker)上。 這....

實際結果

您需要顯式安裝舊式語言環境,例如 en_US.UTF-8。 (想要合理的國際英語語言環境而不想要 en_US 的人可能希望查看en_DK.UTF-8 )。

是的,這涉及到一些

弄臟你的手

這是有關面向 docker 的語言環境設置的參考集合

我不贊成在上面重復的一種反模式,但它太遠了(從這個問題)來擴展這個,所以簡而言之:

設置語言環境通常涉及設置LANG 設置LC_ALL ,尤其是與LANG一起設置是LC_ALL

來自Debian 維基

⚠️警告

強烈建議不要使用 LC_ALL,因為它會覆蓋所有內容。 請僅在測試時使用它,切勿在啟動文件中設置它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM