【问题标题】:Python package not importing after update on Mac OS X在 Mac OS X 上更新后 Python 包未导入
【发布时间】:2018-05-07 06:54:35
【问题描述】:

我最近更新了所有已安装的 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

【问题讨论】:

  • 这通常是一个 xcode 错误,与您的问题无关(我也收到此错误,而所有 python 包在我的机器上都可以正常工作)。您可以发布通过运行$ python -c "import mpi4py; print(mpi4py.__file__)"$ pip show -f mpi4py 获得的输出吗?
  • 啊,好的,谢谢。我已将这些添加到帖子中
  • 这很奇怪 - 文件mpi4py/__init__.py 在那里,所以模块应该是可导入的。你的python版本是什么? $ python -V
  • 我的python版本是Python 2.7.10
  • 哦,我现在明白了——你可能有两条蟒蛇,一条是系统的,一条是酿造的。您能否执行$ python -c "import sys; print(sys.path)" 确认或证明我错了? $ echo $PATH 也很整洁。

标签: python macos mpi


【解决方案1】:

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

export PATH="/usr/local/opt/python/libexec/bin:$PATH"

~/.bash_profile


对于我来说,我宁愿不使用 brewed python 来避免这种错误。尽管这是高度自以为是的,因为许多人宁愿不使用系统 python 也不要破坏它。此外,您将需要sudo 进行此配置!不过,到目前为止,我的方法没有遇到任何问题,所以这就是我所做的:

  1. 列出你为 brewed python 安装的所有包:

    $ pip list --format=freeze > packages-with-brewed-python.txt
    

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

  2. 如果您安装了 brewed python,请通过删除或注释 ~/.bash_profile 中的导出行来停用它

  3. 为系统python安装pip(这是您需要sudo的唯一步骤):

    $ sudo easy_install pip
    

    您现在拥有pip的系统安装,您可以使用它来添加软件包。通过发出pip -V 来检查它:

     $ pip -V
     pip 9.0.1 from /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7)
    
  4. 卸载 brewed python:

    $ brew uninstall python
    
  5. 我使用pip 安装的每个包,我都使用--user 键,所以我不再需要sudo。所以要用新的pip 恢复包,运行

    $ pip install --user -r packages-with-brewed-python.txt
    
  6. 如果您愿意,现在可以清理 brewed python 的包以释放一些空间:

    $ rm -rf /usr/local/lib/python2.7/site-packages/
    

对我来说,这种方法的唯一限制是我需要使用--user 密钥安装软件包,因此它们只能在我的用户帐户上使用(系统范围内没有安装任何东西)。我也在一个没有管理员权限的用户帐户下工作(我有一个单独的帐户),所以基本上,sudo 对我来说是不行的。

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

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2015-11-25
    • 2011-08-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多