致命的Python错误:Py_Initialize:无法获取区域编码...语法错误:无效的语法 异常终止(核心已转储)

我通过运行安装了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

我知道这与我设置路径变量的方式有关,具体来说是在~/.bashrc中,Anaconda自动将我的/home/username/anaconda/bin文件夹添加到$PATH变量中(这是在我首次删除Anaconda后进行第二次安装时发生的)。
我没有修改任何其他环境变量,无论是在~/.profile还是~/.bashrc中。
我在重启之前向我的~/.bashrc中添加了导出$PYTHONPATH行。
现在Anaconda的所有功能都可以使用,尽管大多数打错命令时,同样的致命Python错误:Py_Initialize:无法获取区域编码错误一直会出现,而不是通常的未知命令错误。
我将继续研究这个问题,并在找到原因后编辑我的答案(或参考现有答案)。
7个回答

我建议取消设置PYTHONPATH。通常情况下是不需要的,它会导致类似这样的问题,即一个Python加载另一个Python的内容(在这种情况下,看起来系统的Python 3试图加载为Python 2编写的内容)。

3对于回复晚了,我深表歉意,先生。您所说的取消PYTHONPATH,是指每次启动时手动设置它吗?目前Anaconda运行的是Python 2.7.10,我还没有安装Python 3,那么为什么会出现这个错误呢?我之所以问这个问题,是因为Conda的用户站点目录信息中将PYTHONPATH变量指定为PYTHONPATH: /home/usrnme/anaconda/lib/python2.7:/usr/local/lib/python2.7。如果我从我的~/.bashrc文件中删除PYTHONPATH: /home/usrnme/anaconda..这一行,错误仍然会持续存在,并且Anaconda的功能也无法正常工作,直到我再次设置它。 - samirzach

我在过去几天遇到了类似的问题,所以我追溯到了bash如何处理“command not found”。在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的问题。我会检查是否出现在后来的发行版中。

我的问题有点不同: 作为一个用户,我可以运行python,但作为另一个用户,却不能(我得到了与OP相同的错误)。最后,我发现/usr/lib/python3.5的权限和所有权被搞乱了。原因是我递归地设置了virtualenv的权限和所有权,结果修改了符号链接的目标(即/usr/lib/python3.5)。
提示:使用strace python来查明Python启动过程中发生了什么。当我使用strace时,我清楚地看到/usr/lib/python3.5上出现了PERMISSION_DENIED

在将Python3安装到标准位置并意识到需要使用sudo时,我在我的主目录中使用以下命令进行了本地安装:
python3 -m venv env_py3
source env_py3/bin/activate

但是出现了更多错误。在AWS的Amazon Linux实例上简单地取消设置PYTHONPATH对我来说非常有效。



另一个答案:我懒散地复制了我整个 ~/.virtualenvs 目录,这是从一台旧机器上复制过来的,那个旧机器上安装的是 Python 3.6,所以当我用像 mkvirtualenv --python=$( which python3 ) 这样的命令创建我的 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
  • 如果我不设置VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8,似乎我仍然可以激活环境,但是workon会抱怨"检查是否已安装virtualenwrapper"等等(我选择了这个路径,因为当我使用sudo pip3 install virtualenvwrapper进行新的virtualenvwrapper安装时,3.8是我计算机上唯一安装的系统3.x版本)。

我在Windows上遇到了类似的问题 - 我删除了PYTHONHOME系统变量。 我将尝试将解决方案翻译成英文。我的电脑>属性>高级系统设置>环境变量,查找变量PYTHONHOME并删除它。