2017-11-23 1 views
1

Ich habe kürzlich alle Pip-Pakete aktualisiert, die ich installiert habe, und ich kann mpi4py nicht mehr importieren. Wenn ich versuche, es zu laden, erhalte ich einen Fehler ImportError: No module named mpi4py, sowohl im interaktiven Modus als auch beim Ausführen eines Skripts. (Es kommt auch sowohl für Python 2.7 und Python 3.) (Falls es relevant ist ich bin immer noch mit OS X Yosemite.)Python-Paket wird nach dem Update unter Mac OS X nicht importiert

läuft $ python -c "import mpi4py; print(mpi4py.__file__)" der Ausgang ist:

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

und die Ausgabe von pip show -f mpi4py ist :

Name: mpi4py 
Version: 3.0.0 
Summary: Python bindings for MPI 
Home-page: https://bitbucket.org/mpi4py/mpi4py/ 
Author: Lisandro Dalcin 
Author-email: [email protected] 
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 

Wenn ich python -c "import sys; print(sys.path)" laufen erhalte ich:

['', '$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'] 

und echo $PATH gibt mir:

/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 
+0

Dies ist normalerweise ein xcode-Fehler und bezieht sich nicht auf Ihr Problem (ich bekomme auch diesen Fehler, während alle Python-Pakete auf meinem Rechner funktionieren). Kannst du die Ausgabe posten, die du erhältst, indem du $ python -c ausführst, importiere mpi4py; print (mpi4py .__ file __) und '$ pip show -f mpi4py'? – hoefling

+0

ah, okay, danke. Ich habe diese zum Beitrag hinzugefügt – RGWinston

+0

Das ist seltsam - die Datei 'mpi4py/__ init __. Py' ist da, also sollte das Modul importiert werden können. Was ist deine Python-Version? '$ python -V' – hoefling

Antwort

1

Gemeinsam haben wir das Problem gefunden - Sie haben zwei Installation von Python auf Ihrem Rechner - das System ein (/usr/bin/python) und die „gebraut“ ein, installiert über $ brew install python und befindet sich unter /usr/local/opt/python/libexec/bin/python. Es fehlte in PATH, also bezogen sich die Befehle $ python ... auf das System Python. Alle $ pip ... Befehle bezogen sich jedoch auf den gebrühten Python. Insbesondere wurde mpi4py für die gebrühte Version installiert und aktualisiert, während das System python nicht darauf zugreifen konnte. Die Lösung war, die gebraut Python zurück zu PATH hinzuzufügen:

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

im ~/.bash_profile.


Für mich bevorzuge ich gebrühten Python, um diese Art von Fehlern zu vermeiden. Obwohl dies sehr eigenwillig ist, bevorzugen viele, nicht mit dem System Python zu klimpern, um es nicht zu brechen. Außerdem benötigen Sie für diese Konfiguration sudo! Dennoch habe ich keine Probleme, die nicht so weit mit meinem Ansatz begegnen, so ist es das, was ich getan habe:

  1. Liste alle Pakete, die Sie für die gebraut Python installiert haben:

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

    werden wir brauche diese Datei, um sie mit dem System Python wiederherzustellen.

  2. Wenn Sie Python installiert gebraut haben, deaktivieren Sie es durch das Entfernen oder die Ausstattung der Exportleitung von ~/.bash_profile

  3. Installieren pip für das System Python (dies ist der einzige Schritt, den Sie sudo für benötigen):

    $ sudo easy_install pip 
    

    Sie haben jetzt eine Systeminstallation von pip, was Sie verwenden können, um Pakete hinzuzufügen.Prüfen Sie es durch pip -V Ausgabe:

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

    $ brew uninstall python 
    
  5. Jedes Paket, das ich mit pip installieren, kann ich mit --user Schlüssel so brauche ich nicht sudo mehr. So wiederherzustellen die Pakete mit dem neuen pip, laufen

    $ pip install --user -r packages-with-brewed-python.txt 
    
  6. Wenn Sie möchten, können Sie jetzt Bereinigungs die Pakete des gebraut Python um Platz zu schaffen:

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

Die einzige Einschränkung mit Dieser Ansatz für mich ist, dass ich die Pakete mit --user Schlüssel installieren müssen, so dass sie nur auf meinem Benutzerkonto verfügbar sind (nichts ist systemweit installiert). Ich arbeite auch unter einem Benutzerkonto, das nicht über Administratorrechte verfügt (ich habe ein separates Konto dafür), also ist sudo im Grunde sowieso ein No-Go für mich.

Auch dies ist keine Empfehlung, aber es hat mir viele Kopfschmerzen erspart, verglichen mit der Notwendigkeit, zwischen zwei identischen installierten Python-Versionen zu unterscheiden.