Неустранимая ошибка Python: Py_Initialize: невозможно получить кодировку локали... SyntaxError: неверный синтаксис прерван (ядро выгружено)

Я установил анаконду, запустив

bash Anaconda-2.2.0-Linux-x86_64.sh

команда в моей системе Ubuntu 14.04, которая была успешно установлена, после чего меня попросили экспортировать мой новый /home/username/anaconda/bin Переменная среды $PATH.

После этого я смог использовать все функции anaconda, включая IDE, а также успешно использовать все команды, основанные на conda.

В следующий раз, когда я загрузил свою систему, каждая неправильно набранная команда увидела

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)

ошибка. (Все команды, кроме python чтобы быть конкретным)

После нескольких сообщений об обмене стеками и askubuntu, а также о том, что мой $PYTHONPATH был установлен на usr/local/lib/python2.7, Я пытался

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

но это не помогло

Это заставило меня пройти через всю сагу удалений и переустановок пакетов и, конечно же, множество обновлений и обновлений, чтобы попытаться решить проблему самостоятельно.

conda info -a возвращает:

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

Команда

which python

возвращается

/home/username/anaconda/bin/python

а также

echo "$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

Я знаю, что это связано с тем, как я устанавливаю переменные пути, особенно в ~/.bashrc в котором Anaconda автоматически добавила мою папку /home/username/anaconda/bin в папку $PATH переменная (это произошло во время второй установки Anaconda после того, как я сначала удалил ее).

Я не изменял ни одну другую переменную среды ~/.profile или же ~/.bashrc,


Я добавил строку экспорта $PYTHONPATH в свой ~/.bashrc до перезапуска.

Все функции Anaconda работают сейчас, хотя то же самое Fatal Python error: Py_Initialize: Unable to get the locale encoding ошибка продолжает отображаться вместо обычной неизвестной ошибки команды, для большинства опечаток команд.

Я буду продолжать изучать это и редактировать свой ответ (или ссылаться на существующие ответы, если таковые имеются), как только узнаю, почему это происходит.

7 ответов

Решение

Я бы порекомендовал отключить PYTHONPATH. Обычно это не нужно, и это приводит к тому, что все так ломается, заставляя один Python загружать вещи из другого Python (в этом случае похоже, что Python 3 системы пытается загрузить что-то, что было написано для Python 2).

У меня были подобные проблемы в последние пару дней, поэтому я проследил это до того, как bash обрабатывает "команда не найдена". В Ubuntu 14.04 (и Linux Mint 17, в котором я использую сценарии 14.04), /etc/bash.bashrc имеет следующую функцию:

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

Однако /usr/lib/command-not-found был переписан для Python 3. Он обрабатывает команду /etc/bash.bashrc с помощью:

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)

Это вызывает "python3" с пути, а не дает прямой путь. Чтобы исправить это, строка 22 из /usr/lib/command-not-found должна быть изменена с

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

в

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

Похоже, это ошибка в Ubuntu, а не в Anaconda. Я проверю, чтобы увидеть, появится ли он в более поздних версиях.

Моя проблема была немного другой: как один пользователь, я мог запустить python, но как другой пользователь, нет (я получил ту же ошибку, что и OP). Наконец, я обнаружил, что права доступа и владение /usr/lib/python3.5 были испорчены. Причиной этого было то, что я рекурсивно установил права доступа и владельца для virtualen v, что также привело к изменению целей символической ссылки (targetin /usr/lib/python3.5).

Совет: используйте strace python выяснить, что происходит во время запуска Python. Когда я использовал straceЯ мог ясно видеть PERMISSION_DENIED на /usr/lib/python3.5.

Установив python3 в стандартных местах и ​​поняв, что для его использования мне нужен sudo, я установил локально, используя это в своем домашнем каталоге:

python3 -m venv env_py3
source env_py3/bin/activate

Но было больше ошибок. Простое отключение PYTHONPATH на экземпляре AWS Amazon Linux мне очень помогло.

Это сработало для меня

https://stackoverflow.com/a/39097003/823282

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

Еще один ответ: я лениво скопировал весь каталог ~/.virtualenvs со старой машины, и на этой старой машине была установлена ​​версия 3.6, поэтому, когда все мои среды python3 были созданы с помощью какой-то команды вроде mkvirtualenv --python=$( which python3 ), они получили 3,6. Теперь Ubuntu пошла дальше, и установка python3 по умолчанию дает 3.8. Так я и сделал

      sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.6

и я могу workon tfgpu; ipythonбез сбоя.

Некоторые другие детали:

  • у меня нет $PYTHONHOMEнабор переменных.
  • Мой $PYTHONPATHвключает только личный каталог (в настоящее время он пуст).
  • Мой ~/.bashrcисточники /usr/local/bin/virtualenvwrapper_lazy.sh.
  • Кажется, я могу активировать среды без него, но workonжалуется на "проверьте, что виртуальный пакет был установлен" и т. д., если я не устанавливаю VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8(выбран потому, что, когда я установил новый virtualenvwrapper с sudo pip3 install virtualenvwrapper, 3.8 была единственной системой 3.x, установленной на моем компьютере).

У меня была похожая проблема в Windows - я удалил системную переменную PYTHONHOME. Я постараюсь перевести решение на английский. Мой компьютер> Свойства> Расширенные настройки системы> Переменные среды, найдите переменную PYTHONHOME и удалите ее.

Другие вопросы по тегам