我通过运行安装了 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
。
我在重新启动之前将 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