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

16

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

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конкретных)

Следуя нескольким сообщениям stackexchange и askubuntu, а также заметив, что my $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одна и та же ошибка продолжает появляться вместо обычной неизвестной ошибки команды для большинства опечаток.

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

samirzach
источник

Ответы:

11

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

asmeurer
источник
3
Приношу искренние извинения за поздний ответ, сэр. Отключая PYTHONPATH, вы имеете в виду ручную настройку при запуске каждый раз? Anaconda в настоящее время использует Python 2.7.10, а я не установил Python 3, так почему эта ошибка появляется? Причина, по которой я спрашиваю, заключается в том, что в информации Конды для dirs сайта пользователя переменная PYTHONPATH указана как PYTHONPATH: /home/usrnme/anaconda/lib/python2.7:/usr/local/lib/python2.7. Если я хочу удалить строку PYTHONPATH: / home / usrnme / anaconda .. из моего ~ / .bashrc, ошибка все равно будет сохраняться, и ни одна из функций Anaconda не будет работать, пока я не установлю ее снова.
Самирзах
3

У меня были подобные проблемы в последние пару дней, поэтому я проследил это до того, как 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. Я проверю, чтобы увидеть, появится ли он в более поздних дистрибутивах.

rymac
источник
1

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

python3 -m venv env_py3
source env_py3/bin/activate

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

такелажник
источник
0

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

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

Юусо Охтонен
источник
-3

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

user790300
источник