Erro fatal do Python: Py_Initialize: Não foi possível obter a codificação da localidade… SyntaxError: sintaxe inválida Abortada (núcleo despejado)

16

Instalei o anaconda executando o

bash Anaconda-2.2.0-Linux-x86_64.sh

no meu sistema Ubuntu 14.04, que foi instalado com sucesso, após o qual me foi pedido para exportar minha nova /home/username/anaconda/binvariável de ambiente $ PATH.

Ao fazer isso, pude usar todos os recursos do anaconda, incluindo os IDE, bem como usar todos os comandos baseados em conda com êxito.

Na próxima vez em que iniciei meu sistema, todos os comandos digitados incorretamente viram um erro.

Fatal Python error: Py_Initialize: Unable to get the locale encoding
  File "/usr/local/lib/python2.7/encodings/__init__.py", line 123
    raise CodecRegistryError,\
                            ^
SyntaxError: invalid syntax
Aborted (core dumped)

erro. (Todos os comandos, exceto pythonpara serem específicos)

Seguindo algumas postagens de stackexchange e askubuntu e também percebendo que minha $PYTHONPATHconfiguração estava definida usr/local/lib/python2.7, tentei

export PYTHONPATH=$PYTHONPATH:/home/username/anaconda/lib/python2.7

mas não ajudou.

Isso me fez passar por uma saga inteira de remoções e reinstalações de pacotes e, é claro, muitas atualizações e atualizações, para tentar resolver o problema sozinho.

conda info -a retorna:

CIO_TEST: <not set>
CONDA_DEFAULT_ENV: <not set>
CONDA_ENVS_PATH: <not set>
LD_LIBRARY_PATH: <not set>
PATH: /home/username/anaconda/bin:/home/username/Scala-sbt/sbt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/username/bin:/usr/local/java/jdk1.8.0_20/bin
PYTHONHOME: <not set>
PYTHONPATH: /usr/local/lib/python2.7:/home/username/anaconda/bin/python

O comando

which python

retorna

/home/username/anaconda/bin/python

e

echo "$PATH"

retorna

/home/username/anaconda/bin:/home/username/Scala-sbt/sbt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/username/bin:/usr/local/java/jdk1.8.0_20/bin

Eu sei que tem algo a ver com a maneira como defino as variáveis ​​de caminho, especificamente na ~/.bashrcqual o Anaconda anexou automaticamente minha pasta / home / nome de usuário / anaconda / bin à $PATHvariável (Isso aconteceu durante uma segunda instalação do Anaconda depois que eu o removi primeiro )

Não modifiquei nenhuma outra variável de ambiente em um ~/.profileou em ~/.bashrc.


Adicionei a linha de exportação $ PYTHONPATH à minha ~/.bashrcantes de reiniciar.

Todos os recursos do Anaconda funcionam agora, embora o mesmo Fatal Python error: Py_Initialize: Unable to get the locale encodingerro continue aparecendo em vez do erro de comando desconhecido usual, para a maioria dos comandos digitados incorretamente.

Continuarei analisando isso e editando minha resposta (ou consultando as respostas existentes, se houver) assim que descobrir por que isso acontece.

samirzach
fonte

Respostas:

11

Eu recomendaria desabilitar PYTHONPATH. Geralmente, isso não é necessário e faz com que as coisas quebrem dessa maneira, fazendo um Python carregar coisas de outro Python (nesse caso, parece que o Python 3 do sistema está tentando carregar algo que foi escrito para o Python 2).

asmeurer
fonte
3
Desculpas sinceras pela resposta tardia, senhor. Ao desabilitar o PYTHONPATH, você quer dizer configurá-lo manualmente na inicialização toda vez? O Anaconda executa o Python 2.7.10 atualmente e eu não instalei o Python 3, então por que esse erro seria exibido? A razão pela qual estou perguntando é que as informações da Conda para dirs do site do usuário especificam a variável PYTHONPATH como PYTHONPATH: /home/usrnme/anaconda/lib/python2.7:/usr/local/lib/python2.7. Se eu for remover a linha PYTHONPATH: / home / usrnme / anaconda .. do meu ~ / .bashrc, o erro ainda persistirá e também nenhum dos recursos do Anaconda funcionaria até que eu o definisse novamente.
samirzach 9/07/2015
3

Eu tenho problemas semelhantes nos últimos dois dias, então eu lembrei de como o bash lida com "comando não encontrado". No Ubuntu 14.04 (e Linux Mint 17, que eu uso os scripts 14.04), /etc/bash.bashrc tem a seguinte função:

if [ -x /usr/lib/command-not-found ]; then
    function command_not_found_handle {
        # check because c-n-f could've been removed in the meantime
        if [ -x /usr/lib/command-not-found ]; then
            /usr/bin/python /usr/lib/command-not-found -- $1
            return $?
        else
           return 127
        fi
    }
fi

No entanto, / usr / lib / command-not-found foi reescrito para o Python 3. Ele lida com o comando /etc/bash.bashrc com:

if sys.version < '3':                                                       
    # We might end up being executed with Python 2 due to an old            
    # /etc/bash.bashrc.                                                     
    import os                                                               
    if "COMMAND_NOT_FOUND_FORCE_PYTHON2" not in os.environ:                 
        os.execvp("python3", [sys.argv[0]] + sys.argv)

Isso chama "python3" do caminho em vez de fornecer o caminho direto. Para corrigir isso, a linha 22 de / usr / lib / command-not-found deve ser alterada de

os.execvp("python3", [sys.argv[0]] + sys.argv)

para

os.execv("/usr/bin/python3", [sys.argv[0]] + sys.argv)

Isso parece ser um bug no Ubuntu e não no Anaconda. Vou verificar se ele aparece em distribuições posteriores.

rymac
fonte
1

Depois de instalar o python3 nos locais padrão e perceber que eu precisava do sudo para usá-lo, instalei localmente usando isso no meu diretório pessoal:

python3 -m venv env_py3
source env_py3/bin/activate

Mas teve mais erros. Simplesmente desabilitar o PYTHONPATH na instância do Amazon Linux da AWS funcionou muito bem para mim.

Rigger
fonte
0

Meu problema era um pouco diferente: como um usuário, eu poderia executar python, mas como outro usuário, não (recebi o mesmo erro do OP). Por fim, descobri que as permissões e a propriedade de /usr/lib/python3.5 foram danificadas. O motivo disso foi que eu havia definido recursivamente as permissões e a propriedade no virtualenv, o que acabou modificando os destinos dos links simbólicos (targetin /usr/lib/python3.5 ) também.

Dica: use strace pythonpara descobrir o que está acontecendo durante a inicialização do Python. Quando usei strace, pude ver claramente PERMISSION_DENIED em /usr/lib/python3.5 .

Juuso Ohtonen
fonte
0

Isso funcionou para mim

/programming//a/39097003/823282

rm -rf venv
virtualenv -p /usr/bin/python3 venv/
source venv/bin/activate
pip install -r requirements.txt
activedecay
fonte
-3

Eu tive um problema semelhante no Windows - excluí a variável de sistema PYTHONHOME. Vou tentar traduzir a solução para o inglês. Meu computador> Propriedades> Configurações avançadas do sistema> Variáveis ​​de ambiente, procure a variável PYTHONHOME e exclua-a.

user790300
fonte