致命的 Python 错误:Py_Initialize:无法获取语言环境编码...SyntaxError:语法无效中止(核心转储)

致命的 Python 错误:Py_Initialize:无法获取语言环境编码...SyntaxError:语法无效中止(核心转储)

我通过运行安装了 anaconda

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 帖子并注意到我的$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

我知道这与我设置路径变量的方式有关,特别是~/.bashrcAnaconda 自动将我的 /home/username/anaconda/bin 文件夹添加到$PATH变量中(这是在我第一次删除 Anaconda 后第二次安装期间发生的)。

我没有修改或中的任何其他环境~/.profile变量~/.bashrc


我在重新启动之前将 export $PYTHONPATH 行添加到我的~/.bashrc

Anaconda 的所有功能现在都可以使用了,但是Fatal Python error: Py_Initialize: Unable to get the locale encoding对于大多数输入错误的命令来说,总是出现相同的错误而不是通常的未知命令错误。

一旦我发现为什么会发生这种情况,我将继续调查并编辑我的答案(或参考现有答案,如果有的话)。

答案1

我建议取消设置 PYTHONPATH。通常不需要它,并且它会导致一个 Python 从另一个 Python 加载内容(在这种情况下,看起来系统的 Python 3 正在尝试加载为 Python 2 编写的内容),从而导致这种情况发生。

答案2

过去几天我一直遇到类似的问题,所以我将其追溯到 bash 如何处理“找不到命令”。在 Ubuntu 14.04(以及我使用 14.04 脚本的 Linux Mint 17)中,/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”,而不是提供直接路径。要更正此问题,应将 /usr/lib/command-not-found 的第 22 行从

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

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

这似乎是 Ubuntu 而不是 Anaconda 的一个错误。我会检查它是否出现在后续发行版中。

答案3

我的问题有点不同:作为一个用户,我可以运行python,但作为另一个用户,不能(我得到了与 OP 相同的错误)。最后,我发现/usr/lib/python3.5搞砸了。原因是我递归地设置了 virtualenv 上的权限和所有权,最终修改了符号链接目标(targetin/usr/lib/python3.5) 也是如此。

提示:使用strace python来弄清楚 Python 启动时发生了什么。当我使用 时strace,我可以清楚地看到没有权限/usr/lib/python3.5

答案4

这对我有用

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

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

相关内容