从 Homebrew Python 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
tl;dr:通过执行以下操作之一解决此问题:
输入 hash -r python,或者
注销并登录。
编辑:对我的 related question 的回答清楚地说明了这里发生了什么。当您安装新版本的 python 时,您可能需要运行 hash -r python
来告诉 bash 将“缓存”位置重置为 python
可执行文件。
就我而言,我输入的是 python
,它位于我的 $PATH
上的 /usr/local/bin/python
。但 bash
仍在使用旧的缓存位置 /usr/bin/python
。因此,旧的可执行文件被调用,但 new 路径在 sys.argv[0]
中提供给 python。这意味着旧的可执行文件正在运行,但新的 sys.executable
值导致加载了所有错误的模块(包括 io
模块)。
我有同样的问题。我通过 Python.org 的安装程序安装了 python 2.7.11。奇怪的是,这个问题似乎与我使用完整路径从 shell 调用 OSX 启动 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
因此,作为一种解决方法,您可以尝试做同样的事情。
在其他地方,我发布了一篇关于这种令人费解的行为的separate question。也许只是以某种方式调用 python
调用了 2.7.11 可执行文件与 2.7.10 dylibs 的某种奇怪组合?
根据https://github.com/klen/python-mode/issues/634:
我有同样的问题,但成功修复。在我的例子中,我用自制软件编译了 python 和 vim,当 PYTHON_PATH 被指定并设置为我的开发环境之一时,我也有一些库,包括 io.解决方法很简单:打开新终端,确保您没有自定义 PYTHON_PATH,卸载 python,卸载 vim。重新安装它们。
和
问题解决了。罪魁祸首是从 python 2.7.10 到 2.7.11 的更新。如果您使用 conda 包控制,只需运行“conda install python=2.7.10”即可解决此问题。
但这并没有给出根本原因。由于这发生在 _io
上,这看起来像是 python 2.7.11 中的一个错误(不太可能,如果是的话,会引起世界范围内的强烈抗议和及时修复)或某些包装错误或版本不匹配,特别是与自制版本 (也许还有一些相关的)。
尝试在控制台中执行 import _io
,如果成功,请检查是否从同一路径加载。
sys.path
是否存在差异。
hash
缓存可能会在您安装新版本的 python 后立即变得不正确。 (尝试 type python
来验证问题所在。)您引用的人可能通过他们描述的所有卸载/重新安装意外地解决了这个问题,但直接的解决方法是在终端中输入 hash -r python
。
重新安装python。
brew unlink python && brew reinstall python
保护路径
export PYTHONPATH=$PYTHONPATH:/usr/local/bin/
备份和更改“路径”文件的顺序。
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"
我遇到了同样的问题,只需替换 _io.so 文件即可成功解决。
sudo find / -name _io.so
复制 DOES NOT 属于 python-2.7.11 的 _io.so
文件的路径。例如复制python-2.7.5下的_io.so路径:/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-动态加载/_io.so
将 /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
文件替换为您刚刚找到的 _io.so
。
这在 MacVim 中也发生在我身上。我通过确保 :python print(sys.path)
使用 system Python(例如 /Library/Python/2.7/...
)解决了这个问题
由于我通过 Homebrew 安装了 MacVim,我只是通过以下方式完成了此操作:
生成一个新的 shell,其中包含 python -> /usr/bin/python。对于我的情况,我需要从 .bash_profile 中删除 pyenv 行。如果您通过 Homebrew 安装 Python,您可能需要先 brew unlink python brew reinstall macvim
如果您的问题是由 anaconda
引起的,则无需删除 //anaconda
目录。
只需打开您的 ~/.bash_profile
,找到该行
export PATH="//anaconda/bin:$PATH
并将其注释掉,然后重新启动您的终端会话。
如果您不介意坚持使用 Python 2.7.10,另一个快速解决方法是指定将用于 virtualenv 的 Python 解释器可执行文件的路径。在 OSX 上,该路径通常是 /usr/bin/python
:
virtualenv venv --python=/usr/bin/python
无法添加评论(?)所以这只是为了分享我的经验,降级到 2.7.10 对我有用。
NLTK 下载失败后出现此错误,我需要卸载 anaconda:
sudo rm -rf ~/anaconda
update PATH variable
当我已经尝试在文件夹中创建一个 venv 并错误地尝试初始化第二个时,就会发生这种情况!所以我只是删除了 venv 目录并重新运行了命令。很可能这不是该解决方案的答案,但是搜索我的错误将我带到了这里,因此它可能会帮助其他一些被卡住的人。
我通过删除 /usr/local/bin
中的符号链接并复制该链接指向的实际 python 二进制文件解决了这个问题。
当我尝试使用 PyCharm 时,我遇到了同样的问题。通过在项目配置中设置“python解释器”指向我想要使用的python虚拟环境来解决,这是一个Anaconda env。不知何故,解释器路径缺少 ~/.../anaconda/.../_io.so 的“anaconda”部分。无需卸载 anaconda。
hash -r python
参数过多,您可以使用rehash
命令。