pip install - locale.Error: pengaturan lokal yang tidak didukung

232

Stacktrace penuh:

  ~ pip install virtualenv
Traceback (most recent call last):
  File "/usr/bin/pip", line 11, in <module>
    sys.exit(main())
  File "/usr/lib/python3.4/site-packages/pip/__init__.py", line 215, in main
    locale.setlocale(locale.LC_ALL, '')
  File "/usr/lib64/python3.4/locale.py", line 592, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Di server yang sama, saya berhasil berlari pip install virtualenvdengan python 2.7.x.

Sekarang, saya baru saja menginstal python3.4 menggunakan curl https://bootstrap.pypa.io/get-pip.py | python3.4.

  ~ pip --version
pip 8.1.1 from /usr/lib/python3.4/site-packages (python 3.4)

pip uninstall virtualenv melempar kesalahan yang sama juga

ericn
sumber
2
Apakah Anda sudah membaca ini ?
idjaw
ya saya punya @idjaw, simpul bahwa ini adalah string kosong dalam kasus saya, ini berbeda dari lokal yang salah yang Anda tunjukkan
ericn
Ya, saya memang memperhatikan itu. Apakah Anda mencoba pkg-mengkonfigurasi ulang?
idjaw
server saya adalah centos, bukan Ubuntu @idjaw, saya telah memeriksa dan sepertinya tidak ada yang salah dengan lokalnyaLANG=en_GB.utf8
ericn

Jawaban:

616

Penyebab utamanya adalah: variabel lingkungan Anda LC_ALLentah bagaimana hilang atau tidak valid

Jawaban singkat-

jalankan saja perintah berikut:

$ export LC_ALL=C

Jika Anda terus mendapatkan kesalahan di jendela terminal baru, tambahkan di bagian bawah .bashrcfile Anda .

Jawaban panjang-

Ini localepengaturan saya :

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

Python2.7

    $ uname -a
    Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux
    $ python --version
    Python 2.7.9
    $ pip --version
    pip 8.1.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
    $ unset LC_ALL
    $ pip install virtualenv
    Traceback (most recent call last):
      File "/usr/local/bin/pip", line 11, in <module>
        sys.exit(main())
      File "/usr/local/lib/python2.7/dist-packages/pip/__init__.py", line 215, in main
        locale.setlocale(locale.LC_ALL, '')
      File "/usr/lib/python2.7/locale.py", line 579, in setlocale
        return _setlocale(category, locale)
    locale.Error: unsupported locale setting
    $ export LC_ALL=C
    $ pip install virtualenv
    Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/lib/python2.7/dist-packages
ROY
sumber
5
jadi itu hanya masalah pengaturan variabel lingkungan? Tahukah Anda mengapa saya belum pernah mengalami ini sebelumnya? Bukankah seharusnya nilai ini ditetapkan secara otomatis?
ericn
@ eric Hai, saya baru saja memperbarui posting saya. Masalah ini terjadi dengan python2.7 di komputer saya.
ROY
memang sangat menarik @ROY, saya sudah menyiapkan 2 server lain yang hampir indentical-to-this-server dan mereka belum bekerja dengan baik
ericn
Saya mengalami ini menggunakan letsencrypt-auto, dan export LC_ALL=Cmembantu.
maniexx
10
Jika Anda bertanya-tanya apa LC_ALL=Cartinya, lihat di sini .
Garrett
41

Jalankan perintah berikut (ini akan bekerja):

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
Rahi.Shah
sumber
(-1) dpkg-reconfigurePerintah ini dimaksudkan untuk digunakan pada sistem berbasis Debian. Pertanyaan ini ditandai dengan centos, turunan RHEL yang tidak memberikan dukungan untuk dpkg kecuali Anda mengaktifkan epel-releaserepositori, dan menginstal paket dpkg-devel& dpkg-dev. Meski begitu, ini bukan solusi ideal.
30

Seseorang mungkin menganggapnya berguna. Anda bisa meletakkan pengaturan lokal itu di file .bashrc, yang biasanya terletak di direktori home.
Cukup tambahkan perintah ini di .bashrc:
export LC_ALL=C
lalu ketik source .bashrc
Sekarang Anda tidak perlu memanggil perintah ini secara manual setiap kali, ketika Anda terhubung melalui ssh misalnya.

Ivan Semochkin
sumber
4

Meskipun Anda dapat mengatur lokal mengekspor variabel env, Anda harus melakukannya setiap kali memulai sesi. Mengatur lokal dengan cara ini akan menyelesaikan masalah secara permanen:

sudo apt-get install locales
sudo locale-gen en_US.UTF-8
sudo echo "LANG=en_US.UTF-8" > /etc/default/locale
Marco Lavagnino
sumber
Apakah saya salah paham, atau Anda menggunakan sudojalur yang sama dengan yang Anda coba instal? sudo apt-get install ... sudo ...
CyberEd
2
@CyberEd, Anda benar, saya telah mengedit contoh untuk menghapus dependensi yang tidak dibutuhkan.
Marco Lavagnino
3

[Jawaban ini hanya untuk platform linux]

Hal pertama yang harus Anda ketahui adalah sebagian besar lokasi path file config terletak dapat diperoleh dari localedef --help:

$ localedef --help | tail -n 5
System's directory for character maps : /usr/share/i18n/charmaps
                       repertoire maps: /usr/share/i18n/repertoiremaps
                       locale path    : /usr/lib/locale:/usr/share/i18n
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>

Lihat yang terakhir /usr/share/i18n? Di sinilah file konfigurasi xx_XX.UTF-8 Anda berada:

$ ls /usr/share/i18n/locales/zh_*
/usr/share/i18n/locales/zh_CN  /usr/share/i18n/locales/zh_HK  /usr/share/i18n/locales/zh_SG  /usr/share/i18n/locales/zh_TW

Sekarang apa ? Kita perlu mengkompilasinya ke dalam arsip biner. Salah satu caranya, misalkan anggap saya punya /usr/share/i18n/locales/en_LOVE, saya bisa menambahkannya ke daftar kompilasi, yaitu /etc/locale-genfile:

$ tail -1 /etc/locale.gen 
en_LOVE.UTF-8 UTF-8

Dan kompilasi ke biner dengan sudo locale-gen:

$ sudo locale-gen 
Generating locales (this might take a while)...
  en_AG.UTF-8... done
  en_AU.UTF-8... done
  en_BW.UTF-8... done
  ...
  en_LOVE.UTF-8... done
Generation complete.

Dan sekarang perbarui lokal sistem default dengan yang diinginkan LANG, LC_ALL... dll dengan ini update-locale:

sudo update-locale LANG=en_LOVE.UTF-8

update-localesebenarnya juga berarti memperbarui /etc/default/localefile ini yang akan sumber oleh sistem saat login ke pengaturan variabel lingkungan:

$ head /etc/default/locale 
#  File generated by update-locale
LANG=en_LOVE.UTF-8
LC_NUMERIC="en_US.UTF-8"
...

Tetapi kita mungkin tidak ingin mem-boot ulang agar berfungsi, jadi kita bisa sumberkan saja ke variabel lingkungan di sesi shell saat ini:

$ . /etc/default/locale

Bagaimana dengan sudo dpkg-reconfigure locales? Jika Anda memutarnya, Anda akan tahu perintah ini pada dasarnya bertindak sebagai GUI untuk menyederhanakan langkah-langkah di atas, yaitu Edit /etc/locale.gen-> sudo locale-gen->sudo update-locale LANG=en_LOVE.UTF-8

Untuk python, selama /etc/locale.genmengandung kandidat lokal itu dan locale.gendikompilasi, setlocale(category, locale)harus bekerja tanpa lemparan locale.Error: unsupoorted locale setting. Anda dapat memeriksa string yang benar en_US.UTF-8/ yang en_US/....etcakan ditetapkan setlocale(), dengan mengamati /etc/locale.genfile, dan kemudian menghapus komentar dan mengkompilasinya sesuai keinginan. zh_CN GB2312tanpa titik dalam file itu berarti string yang benar adalah zh_CNdan zh_CN.GB2312.

Buah
sumber
Untuk situasi saya, jawaban singkatnya adalah: 1. sunting /etc/locale.gen, batalkan komentar pada zh_CN.UTF-8baris; 2 sudo locale-gen..
SnowOnion
2

Saya memiliki masalah yang sama, dan tidak berhasil untuk saya ."export LC_ALL=c"

Coba export LC_ALL="en_US.UTF-8"(ini akan berhasil).

Benyamin Jafari
sumber
1

Pesan kesalahan menunjukkan masalah dengan pengaturan lokal. Untuk memperbaikinya seperti yang ditunjukkan oleh jawaban lain Anda perlu mengubah lokal Anda.

Pada Mac OS X Sierra saya menemukan bahwa cara terbaik untuk melakukan ini adalah memodifikasi ~/bash_profilefile sebagai berikut:

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

Perubahan ini tidak akan segera jelas dalam sesi cli Anda saat ini kecuali Anda reload profil pesta dengan menggunakan: source ~/.bash_profile.

Jawaban ini cukup dekat dengan jawaban yang telah saya posting ke pertanyaan non-identik, non-duplikat lainnya (yaitu tidak terkait dengan pipenv) tetapi yang kebetulan membutuhkan solusi yang sama.

Untuk moderator: Dengan hormat; jawaban saya sebelumnya dihapus karena alasan ini tetapi saya merasa itu agak konyol karena sebenarnya jawaban ini berlaku hampir setiap kali kesalahannya adalah "masalah dengan lokal" ... tetapi ada sejumlah situasi, bahasa, dan lingkungan yang berbeda yang dapat memicu kesalahan itu.

Jadi, A) tidak masuk akal untuk menandai pertanyaan sebagai duplikat dan B) tidak masuk akal untuk menyesuaikan jawaban baik karena perbaikannya sangat sederhana, sama dalam setiap kasus dan tidak mendapat manfaat dari ornamen.

geoides
sumber
1

Ubuntu:

$ sudo vi /etc/default/locale

Tambahkan pengaturan di bawah ini di akhir file.

LC_ALL = en_US.UTF-8

saneryee
sumber