未找到符号:__ PyCodecInfo_GetIncrementalDecder

自从从 HomebrewPython 2.7.11(从2.7.10开始)更新以来,我突然无法从 PyCharm IDE 控制台在 PyPi 上测试注册我的包。

运行(作为“外部工具”)

python -B setup.py register -r pypitest

我现在明白了

Traceback (most recent call last):
File "setup.py", line 22, in <module>
from setuptools import setup
File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 12, in <module>
from setuptools.extension import Extension
File "/usr/local/lib/python2.7/site-packages/setuptools/extension.py", line 8, in <module>
from .dist import _get_unpatched
File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 16, in <module>
from setuptools.depends import Require
File "/usr/local/lib/python2.7/site-packages/setuptools/depends.py", line 6, in <module>
from setuptools import compat
File "/usr/local/lib/python2.7/site-packages/setuptools/compat.py", line 17, in <module>
import httplib
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 80, in <module>
import mimetools
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/mimetools.py", line 6, in <module>
import tempfile
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tempfile.py", line 32, in <module>
import io as _io
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in <module>
import _io
ImportError: dlopen(/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
Referenced from: /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
Expected in: flat namespace
in /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so


Process finished with exit code 1

我不知道该怎么办。只有在 IDE 的控制台内执行时才会出现这个问题。如果我直接在系统命令行(OS X 上的终端)做,我没有问题。


OS X 10.11.3; 家酿 Python 2.7.11; PyCharm 5.0.3

52222 次浏览

根据 https://github.com/klen/python-mode/issues/634:

我也有同样的问题,但是成功地解决了 当指定了 PYTHON _ PATH 并且 设置为我的一个开发环境,在那里我还有一些库, 解决方法很简单: 打开新的终端,确保 您没有定制的 PYTHON _ PATH、卸载 PYTHON、卸载 vim。 重新安装两个。

还有

问题解决了。

罪魁祸首是从 python 2.7.10到2.7.11的更新。

如果您正在使用 conda 包控件,只需运行“ conda install” Python = 2.7.10”将解决这个问题。

但这并不是根本原因。由于这种情况发生在 _io上,这看起来像是 python 2.7.11中的一个 bug (不太可能,如果是的话会有全世界范围的抗议和提示修复)或者一些包装错误或版本与自制版本不匹配(也许还有一些相关的错误)。

尝试在控制台中使用 import _io,如果成功,检查它是否从相同的路径加载。

我也遇到过同样的问题,只要替换 _ io.so 文件就可以成功地解决这个问题。

sudo find / -name _io.so

复制属于 python-2.7.11的 _io.so文件的路径。例如,复制 python-2.7.5下的 _ io.so 路径: /usr/local/Cellar/python/2.7.5/Framework/Python.Framework/Versions/2.7/lib/python2.7/lib-dynload/_ io.so

用刚才找到的 _io.so替换 /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so文件。

Dr: 通过执行下列操作之一解决此问题:

  • 类型 hash -r python
  • 登出并登入。

编辑: 对我的 相关问题的回答清楚地表明了这里发生了什么。安装新版本的 python 时,可能需要运行 hash -r python来告诉 bash 将“缓存”位置重置为 python可执行文件。

在我的案例中,我输入的是 python,这是在我的 $PATH/usr/local/bin/python。但是 bash仍然使用旧的缓存位置 /usr/bin/python。因此,调用了旧的可执行文件,但是在 sys.argv[0]中为 python 提供了 新的路径。这意味着旧的可执行文件正在运行,但是新的 sys.executable值导致加载了所有错误的模块(包括 io模块)。


我也有同样的问题。我通过来自 Python.org 的安装程序安装了 python2.7.11。奇怪的是,这个问题似乎与 OSX 在使用完整路径从 shell 调用 python时启动 python与仅使用单词 python之间的一些细微差别有关。

因此,对我来说,这是可行的(通过完整路径 /usr/local/bin/python调用 python) :

$ which python
/usr/local/bin/python
$ /usr/local/bin/python -c "import io"
$

但这个不是:

$ python -c "import io"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in <module>
import _io
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
Expected in: flat namespace
in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so

所以,作为一个变通方法,你可以尝试做同样的事情。

在其他地方,我已经发布了一个关于这个令人困惑的行为的 另一个问题。也许仅仅调用 python就会调用2.7.11可执行文件和2.7.10 dylibs 的某种奇怪组合? ?

我在 MacVim 中也遇到过这种情况,我通过确保 :python print(sys.path)使用 Python 系统(例如 /Library/Python/2.7/...)来解决这个问题

因为我是通过自制软件安装 MacVim 的,我只是通过:

  1. 产生一个具有 which python-> /usr/bin/python的新 shell。对于我的情况,我需要删除的 pyenv线从我的 .bash_profile。如果你安装 Python 通过家酿你可能要 brew unlink python第一

  2. brew reinstall macvim

当我已经尝试在一个文件夹中创建一个 venv,并错误地试图初始化第二个 venv 时,就会发生这种情况!所以我删除了 venv 目录并重新运行了命令。很可能这不是这个解决方案的答案,但是搜索我的错误把我带到这里,所以它可以帮助一些其他人谁卡住了。

不能添加注释(?) ,所以这只是为了分享我的专家,降级到2.7。

重新安装 python。

brew unlink python && brew reinstall python

守住通道

export PYTHONPATH=$PYTHONPATH:/usr/local/bin/

BACKUP 并更改“路径”文件的顺序。

sudo nano /etc/paths

看起来,路径的顺序决定了正确运行 python。在我的例子中,结果是:

#sudo nano /etc/paths
/usr/bin
/usr/local/bin
/bin
/usr/sbin
/sbin

在我的 Mac 上,路径是这样的。

$ which python
/usr/local/bin/python

现在我可以两者兼顾:

$ /usr/local/bin/python -c "import io"
$ python -c "import io"

在下载 NLTK 失败后,我得到了这个错误,我需要卸载 anaconda:

sudo rm -rf ~/anaconda
update PATH variable

如果问题是由 anaconda引起的,则不必删除 //anaconda目录。

打开你的 ~/.bash_profile找到那条线

export PATH="//anaconda/bin:$PATH

并注释掉它,然后重新启动终端会话。

如果您不介意坚持使用 Python 2.7.10的话,另一个快速解决方案是指定将用于 viralenv 的 Python 解释器可执行文件的路径。在 OSX 上,这条路径通常是 /usr/bin/python:

virtualenv venv --python=/usr/bin/python

我通过删除 /usr/local/bin中的符号链接并复制实际的 python 二进制文件来解决这个问题。

当我试图使用 PyCharm 时也遇到了同样的问题。通过在项目配置中设置“ python 解释器”来指向我想要使用的 python 虚拟 env,这是一个 Anaconda env。不知何故,解释器路径缺少 ~/.../anaconda/.../_ io.so 的“ anaconda”部分。不需要卸载水蟒。