在Mac OS X上更新后不会导入Python包

时间:2017-11-23 10:29:51

标签: python macos mpi

我最近更新了我安装的所有pip包,但我无法再导入mpi4py。如果我尝试加载它,我会在交互模式和运行脚本时收到错误ImportError: No module named mpi4py。 (对于python 2.7和python 3也会发生这种情况。)(如果相关,我仍然使用OS X Yosemite。)

运行$ python -c "import mpi4py; print(mpi4py.__file__)"输出为:

Traceback (most recent call last): 
File "<string>", line 1, in <module> 
ImportError: No module named mpi4py`

pip show -f mpi4py的输出为:

Name: mpi4py
Version: 3.0.0
Summary: Python bindings for MPI
Home-page: https://bitbucket.org/mpi4py/mpi4py/
Author: Lisandro Dalcin
Author-email: dalcinl@gmail.com
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: 
Files:
  mpi4py-3.0.0.dist-info/DESCRIPTION.rst,mpi4py-3.0.0.dist-info/INSTALLER,mpi4py-3.0.0.dist-info/METADATA,mpi4py-3.0.0.dist-info/RECORD,mpi4py-3.0.0.dist-info/WHEEL,mpi4py-3.0.0.dist-info/metadata.json,mpi4py-3.0.0.dist-info/top_level.txt,mpi4py/MPI.pxd,mpi4py/MPI.so,mpi4py/__init__.pxd,mpi4py/__init__.py,mpi4py/__init__.pyc,mpi4py/__main__.py,mpi4py/__main__.pyc,mpi4py/bench.py,mpi4py/bench.pyc,mpi4py/dl.so,mpi4py/futures/__init__.py,mpi4py/futures/__init__.pyc,mpi4py/futures/__main__.py,mpi4py/futures/__main__.pyc,mpi4py/futures/_base.py,mpi4py/futures/_base.pyc,mpi4py/futures/_lib.py,mpi4py/futures/_lib.pyc,mpi4py/futures/aplus.py,mpi4py/futures/aplus.pyc,mpi4py/futures/pool.py,mpi4py/futures/pool.pyc,mpi4py/futures/server.py,mpi4py/futures/server.pyc,mpi4py/include/mpi4py/mpi.pxi,mpi4py/include/mpi4py/mpi4py.MPI.h,mpi4py/include/mpi4py/mpi4py.MPI_api.h,mpi4py/include/mpi4py/mpi4py.h,mpi4py/include/mpi4py/mpi4py.i,mpi4py/libmpi.pxd,mpi4py/mpi.cfg,mpi4py/run.py,mpi4py/run.pyc

如果我运行python -c "import sys; print(sys.path)",我会:

['', '$HOME',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
'/Users/cns08/Library/Python/2.7/lib/python/site-packages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', 
'/Library/Python/2.7/site-packages']

echo $PATH给了我:

/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.4/bin
:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin

1 个答案:

答案 0 :(得分:2)

我们一起发现了这个问题 - 您的计算机上安装了两个python - 系统一个(/usr/bin/python)和“brewed”一个,通过$ brew install python安装并位于{{ 1}}。 /usr/local/opt/python/libexec/bin/python中缺少它,因此命令PATH引用了系统python。但是,所有$ python ...命令都引用了brewed python。特别是,为酿造版本安装并更新了$ pip ...,而系统python无法访问它。解决方案是将酿造的python添加回mpi4py

PATH
<{1>}中的

至于我,我不想使用brewed python来避免这种错误。虽然这是高度自以为是,因为许多人宁愿不与系统python叮当作响而不打破它。此外,此配置需要export PATH="/usr/local/opt/python/libexec/bin:$PATH" !尽管如此,到目前为止我的方法并没有遇到任何问题,所以这就是我所做的:

  1. 列出您为brewed python安装的所有软件包:

    ~/.bash_profile

    我们需要这个文件来使用系统python恢复它们。

  2. 如果您已经安装了brew,请通过从sudo

  3. 删除或评论导出行来停用它
  4. 为系统python安装$ pip list --format=freeze > packages-with-brewed-python.txt (这是您需要~/.bash_profile的唯一步骤):

    pip

    现在您可以使用sudo系统安装添加软件包的内容。通过发出$ sudo easy_install pip

    进行检查
    pip
  5. 卸载brewed python:

    pip -V
  6. 我使用 $ pip -V pip 9.0.1 from /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7) 安装的每个软件包,我都使用$ brew uninstall python 密钥,因此我不再需要pip。因此,要使用新的--user恢复软件包,请运行

    sudo
  7. 如果您愿意,您现在可以清理煮好的python软件包以释放一些空间:

    pip
  8. 这种方法的唯一限制是我需要使用$ pip install --user -r packages-with-brewed-python.txt 密钥安装软件包,因此它们只能在我的用户帐户上使用(系统范围内没有安装任何软件)。我也在一个没有管理员权限的用户帐户下工作(我有一个单独的帐户),所以基本上,$ rm -rf /usr/local/lib/python2.7/site-packages/ 对我来说是不行的。

    同样,这不是任何建议,但与安装两个相同的python版本之间的必要性相比,它为我节省了许多麻烦。