Неустранимая ошибка 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 и удалите ее.