Ich versuche ein Skript auszuführen, das unter anderem ein python script startet. Ich erhalte jedoch einen ImportError: No module named ..., wenn ich ipython starte und das gleiche importiere Modul in der gleichen Weise durch den Interpreter wird das Modul akzeptiert.
Was ist los und wie kann ich das beheben? Ich habe versucht zu verstehen, wie python verwendet PYTHONPATH, aber ich bin gründlich verwirrt. Jede Hilfe wäre sehr dankbar.
Dieses Problem tritt auf, weil der Befehlszeilen-IPython-Interpreter Ihren aktuellen Pfad verwendet, im Gegensatz zu einem separaten Prozess (sei es ein IPython-Notizbuch) , externer Prozess, etc). IPython sucht nach zu importierenden Modulen, die sich nicht nur in Ihrer Datei sys.path, sondern auch in Ihrem aktuellen Arbeitsverzeichnis befinden. Wenn Sie einen Interpreter über die Befehlszeile starten, ist das aktuelle Verzeichnis, in dem Sie sich befinden, dasselbe, in dem Sie ipython gestartet haben
import os
os.getcwd()
sie werden sehen, dass dies wahr ist.
Nehmen wir jedoch an, Sie verwenden ein ipython-Notizbuch, führen os.getcwd()
aus, und Ihr aktuelles Arbeitsverzeichnis ist stattdessen der Ordner, in dem Sie das Notizbuch angewiesen haben, in Ihrer ipython_notebook_config.py-Datei zu arbeiten (normalerweise mit c.NotebookManager.notebook_dir
Einstellen).
Die Lösung besteht darin, dem Interpreter python mit dem Pfad zu Ihrem Modul zu versehen. Die einfachste Lösung besteht darin, diesen Pfad an Ihre sys.path-Liste anzuhängen. Versuchen Sie in Ihrem Notizbuch zunächst Folgendes:
import sys
sys.path.append('my/path/to/module/folder')
import module-of-interest
Wenn dies nicht funktioniert, liegt ein anderes Problem vor, das nicht mit dem Importpfad zusammenhängt, und Sie sollten weitere Informationen zu Ihrem Problem bereitstellen.
Die bessere (und dauerhaftere) Möglichkeit, dies zu lösen, besteht darin, Ihren [~ # ~] Pythonpfad [~ # ~] festzulegen, der dem Interpreter zur Verfügung steht Weitere Verzeichnisse suchen nach python packages/modules. Das Bearbeiten oder Festlegen von PYTHONPATH als globale Variable hängt vom Betriebssystem ab und wird hier für nix oder - ausführlich beschrieben. Windows .
Erstellen Sie einfach eine leere python Datei mit dem Namen __init__.py
unter dem Ordner, der Fehler anzeigt, während Sie das python project.
Stellen Sie sicher, dass beide denselben Interpreter verwenden. Das ist mir auf Ubuntu passiert:
$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]
$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]
Und sys.path
unterschied sich zwischen den beiden Dolmetschern. Um das Problem zu beheben, entfernte ich Python 3.3.
Das Ausführen von sys.path.append('my-path-to-module-folder')
funktioniert. Um dies jedoch nicht jedes Mal in IPython ausführen zu müssen, wenn Sie das Modul verwenden möchten, können Sie Ihrer export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
- Datei ~/.bash_profile
Hinzufügen.
Der Hauptgrund sind die sys.paths von Python und IPython sind unterschiedlich.
Bitte beachten Sie Lucypark Link , die Lösung funktioniert in meinem Fall. Es passiert, wenn opencv von installiert wird
conda install opencv
Und ich habe einen Importfehler in iPython bekommen. Es gibt drei Schritte, um dieses Problem zu lösen:
import cv2
ImportError: ...
1. Überprüfen Sie den Pfad in Python und iPython mit folgendem Befehl
import sys
sys.path
Sie werden unterschiedliche Ergebnisse von Python und Jupyter finden. Zweiter Schritt, verwenden Sie einfach sys.path.append
, um den fehlenden Pfad durch Ausprobieren zu beheben.
2. Temporäre Lösung
In iPython:
import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2
das ImportError:..
Problem gelöst
3. Permanente Lösung
Erstellen Sie ein iPython-Profil und legen Sie das erste Anhängen fest:
In bash Shell:
ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py
In vi an die Datei anhängen:
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]
GETAN
Vor der Installation von ipython habe ich Module über easy_install installiert. sagen Sudo easy_install mechanize
.
Nach der Installation von ipython musste easy_install erneut ausgeführt werden, damit ipython die Module erkennt.
Wenn Sie es über die Befehlszeile ausführen, ist dem python interpreter manchmal nicht bekannt, wo nach Modulen gesucht werden muss.
Unten ist die Verzeichnisstruktur meines Projekts:
/project/apps/..
/project/tests/..
Ich lief unter Befehl:
>> cd project
>> python tests/my_test.py
Nachdem ich über Befehl gelaufen bin, habe ich unter Fehler
no module named lib
lib wurde in my_test.py importiert
ich habe sys.path ausgedruckt und herausgefunden, dass der Pfad des Projekts, an dem ich arbeite, nicht in der sys.path-Liste verfügbar ist
ich habe folgenden Code am Anfang meines Skripts hinzugefügt my_test.py
.
import sys
import os
module_path = os.path.abspath(os.getcwd())
if module_path not in sys.path:
sys.path.append(module_path)
Ich bin mir nicht sicher, ob es ein guter Weg ist, es zu lösen, aber ja, es hat bei mir funktioniert.
Ich habe festgestellt, dass die Lösung für dieses Problem hier ausführlich dokumentiert wurde:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
Grundsätzlich müssen Sie die Pakete in der Jupyter-Umgebung installieren und dabei Shell-Befehle wie die folgenden eingeben:
!{sys.executable} -m pip install numpy
Bitte überprüfen Sie den obigen Link für eine verbindliche vollständige Antwort.
Hatte ein ähnliches Problem, das durch Aufrufen von python3
Anstelle von python
behoben wurde. Meine Module waren in Python3.5.
Ich habe noch eine andere Quelle für diese Diskrepanz gefunden:
Ich habe ipython sowohl lokal als auch gemeinsam in virtualenvs installiert. Mein Problem war, dass in einem neu erstellten Virtualenv mit ipython das System ipython aufgegriffen wurde, das eine andere Version als python und ipython in virtualenv (a 2.7.x vs. a 3.5.x) und Heiterkeit folgte.
Ich denke, das Kluge bei der Installation von etwas, das eine Binärdatei in yourvirtualenv/bin
Enthält, ist, sofort rehash
oder ähnliches für die von Ihnen verwendete Shell auszuführen, damit das richtige Python/Ipython abgerufen wird . (Muss überprüft werden, ob es geeignete pip
Post-Install-Hooks gibt ...)
Lösung ohne Scripting:
Dies ist wahrscheinlich verursacht durch verschiedene python auf Ihrem System installierte Versionen, d. H. Python2 oder Python.
Führen Sie den Befehl aus $ pip --version
und $ pip3 --version
um zu überprüfen, von welchem pip um Python 3x stammt. Z.B. Sie sollten die folgenden Versionsinformationen sehen:
pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
Führen Sie dann das example.py
Skript mit dem folgenden Befehl
$ python3 example.py
So habe ich es behoben:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)