pip install - locale.Error: configuração de local não suportada

232

Stacktrace completo:

  ~ 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

No mesmo servidor, executei pip install virtualenvcom sucesso o python 2.7.x.

Agora, eu acabei de instalar o python3.4 usando 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 também lança o mesmo erro

ericn
fonte
2
Você já leu isso ?
Idjaw #
sim eu tenho @idjaw, o nó que é uma cadeia vazia no meu caso, é diferente da localidade errado você apontou
ericn
Sim, eu notei isso. Você tentou o pkg-reconfigure?
Idjaw #
meu servidor é centos, não Ubuntu @idjaw, eu verifiquei e parece haver nada de errado com o local, que éLANG=en_GB.utf8
ericn

Respostas:

616

A causa principal é: sua variável de ambiente LC_ALLestá ausente ou é inválida de alguma forma

Resposta curta-

basta executar o seguinte comando:

$ export LC_ALL=C

Se você continuar recebendo o erro nas novas janelas do terminal, adicione-o na parte inferior do seu .bashrcarquivo.

Resposta longa-

Aqui estão as minhas localeconfigurações:

$ 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
fonte
5
então é apenas uma questão de configurar uma variável de ambiente? Você sabe por que nunca encontrei isso antes? Este valor não deve ser definido automaticamente?
ericn
Olá, acabei de atualizar meu post. Esse problema ocorre com o python2.7 no meu computador.
ROY
muito interessante @ROY, eu tive 2 outros servidores quase-indentical-se este servidor criadas e eles haven sido funcionando perfeitamente bem
ericn
Eu encontrei isso usando letsencrypt-auto e export LC_ALL=Cajudei.
Maniexx #
10
Se você está se perguntando o que LC_ALL=Csignifica, veja aqui .
Garrett
41

Execute o seguinte comando (funcionará):

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
Rahi.Shah
fonte
(-1) O dpkg-reconfigurecomando é destinado ao uso em sistemas baseados em Debian. Esta questão é marcado com centos, um derivado RHEL que não fornecem suporte para dpkg a menos que você permitir que o epel-releaserepositório, e instalar os dpkg-devele dpkg-devpacotes. Mesmo assim, essa não é uma solução ideal.
30

Alguém pode achar útil. Você pode colocar essas configurações de localidade no arquivo .bashrc, que geralmente está localizado no diretório inicial.
Apenas adicione este comando no .bashrc:
export LC_ALL=C
e digite source .bashrc
Agora você não precisa chamar esse comando manualmente todas as vezes, ao conectar via ssh, por exemplo.

Ivan Semochkin
fonte
4

Enquanto você pode definir o código do idioma exportando uma variável env, você precisará fazer isso toda vez que iniciar uma sessão. Definir um código de idioma dessa maneira resolverá o problema permanentemente:

sudo apt-get install locales
sudo locale-gen en_US.UTF-8
sudo echo "LANG=en_US.UTF-8" > /etc/default/locale
Marco Lavagnino
fonte
Estou entendendo mal ou você está usando sudoa mesma linha que tenta instalá-lo? sudo apt-get install ... sudo ...
CyberEd 28/05
2
@ CyberEd, você está certo, editei o exemplo para remover dependências desnecessárias.
Marco Lavagnino 28/05
3

[Esta resposta é direcionada apenas na plataforma Linux]

A primeira coisa que você deve saber é que a maior parte do caminho localizado no arquivo de configuração de localidade pode ser obtida em 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>

Veja o último /usr/share/i18n? É aqui que o seu arquivo de configuração xx_XX.UTF-8 está localizado:

$ 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

O que agora ? Precisamos compilá-los no arquivo binário. Por um lado, por exemplo, suponha que eu tenha /usr/share/i18n/locales/en_LOVE, posso adicioná-lo à lista de compilação, ou seja, /etc/locale-genarquivo:

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

E compile-o para o binário com 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.

E agora atualize o código do idioma padrão do sistema com o desejado LANG, LC_ALLetc., com este update-locale:

sudo update-locale LANG=en_LOVE.UTF-8

update-localena verdade, também significa atualizar esse /etc/default/localearquivo, que será originado pelo sistema no login para configurar variáveis ​​de ambiente:

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

Mas podemos não querer reiniciar para entrar em vigor, portanto, podemos apenas fornecê-lo para a variável de ambiente na atual sessão do shell:

$ . /etc/default/locale

Que tal sudo dpkg-reconfigure locales? Se você brincar com isso, você saberá que este comando age basicamente como GUI para simplificar as etapas acima, ou seja, Editar /etc/locale.gen->sudo locale-gen ->sudo update-locale LANG=en_LOVE.UTF-8

Para python, contanto que /etc/locale.genesse candidato locale e locale.genseja compilado, setlocale(category, locale)deve funcionar sem lançamentos locale.Error: unsupoorted locale setting. Você pode verificar a sequência correta en_US.UTF-8/ en_US/....etca ser configurada setlocale(), observando o /etc/locale.genarquivo e, em seguida, remova o comentário e compile-a conforme desejado. zh_CN GB2312sem ponto nesse arquivo significa que a string correta é zh_CNe zh_CN.GB2312.

Fruta
fonte
Para minha situação, a resposta curta é: 1. edite /etc/locale.gen, descomente a zh_CN.UTF-8linha; 2. sudo locale-gen.
SnowOnion 7/03/19
2

Eu tive o mesmo problema e não funcionou para mim ."export LC_ALL=c"

Tente export LC_ALL="en_US.UTF-8"(funcionará).

Benyamin Jafari
fonte
1

A mensagem de erro indica um problema com a configuração de localidade. Para corrigir isso conforme indicado por outras respostas, você precisa modificar seu código de idioma.

No Mac OS X Sierra, descobri que a melhor maneira de fazer isso era modificar o ~/bash_profilearquivo da seguinte maneira:

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

Esta mudança não será imediatamente evidente em sua sessão cli atual, a menos que você recarregar o perfil do bash usando: source ~/.bash_profile.

Essa resposta está bem próxima das respostas que eu publiquei em outras perguntas não idênticas e não duplicadas (ou seja, não relacionadas ao pipenv), mas que exigem a mesma solução.

Para o moderador: Com respeito; minha resposta anterior foi excluída por esse motivo, mas acho que isso foi um pouco tolo, porque na verdade essa resposta se aplica quase sempre que o erro é "problema com o código do idioma" ... mas existem várias situações, idiomas e ambientes diferentes que podem desencadear esse erro.

Portanto, A) não faz sentido marcar as perguntas como duplicadas e B) não faz sentido adaptar a resposta também porque a correção é muito simples, é a mesma em cada caso e não se beneficia da ornamentação.

geoidesic
fonte
1

Ubuntu:

$ sudo vi /etc/default/locale

Adicione a configuração abaixo no final do arquivo.

LC_ALL = en_US.UTF-8

saneryee
fonte