"ImportError: Kein Modul benannt" beim Versuch, Python-Skript auszuführen

144

Ich versuche ein Skript auszuführen, das unter anderem ein Python-Skript startet. Ich erhalte einen ImportError: Kein Modul mit dem Namen ... Wenn ich jedoch ipython starte und dasselbe Modul auf dieselbe Weise über den Interpreter importiere, wird das Modul akzeptiert.

Was ist los und wie kann ich das beheben? Ich habe versucht zu verstehen, wie Python PYTHONPATH verwendet, bin aber völlig verwirrt. Jede Hilfe wäre sehr dankbar.

CodeOcelot
quelle
4
Sie müssen weitere Informationen geben. Wenn Sie "Skript ausführen" sagen, meinen Sie damit ein Shell-Skript? Welches Modul können Sie nicht importieren? Wo befindet sich das Modul? Wo befindet sich Ihr Skript?
BrenBarn
2
Wenn Sie eine endgültige Antwort auf "Was ist los?" Möchten, starten Sie Python mit der -vOption und Sie werden sehen, wo Python die von Ihnen importierten Module findet (oder nicht).
FatalError
Was versuchst du zu importieren? Befinden sich die beiden Python-Skripte im selben Verzeichnis?
Pynovice
2
Bitte geben Sie uns den Code, den Sie ausführen, den vollständigen Text des Stack-Trace und die genauen Schritte, die Sie unternehmen, um den Fehler zu erzeugen. Es ist ziemlich schwierig zu helfen, wenn wir nicht genau wissen, wo das Problem liegt.
MattDMo
5
Ich denke, es ist ein Problem, das viele Benutzer haben, selbst 4 Jahre nachdem die Frage zum ersten Mal gestellt wurde.
CodeOcelot

Antworten:

182

Dieses Problem tritt auf, wie der IPython-Befehlszeileninterpreter Ihren aktuellen Pfad verwendet und wie ein separater Prozess (sei es ein IPython-Notizbuch, ein externer Prozess usw.). IPython sucht nach zu importierenden Modulen, die sich nicht nur in Ihrem sys.path, sondern auch in Ihrem aktuellen Arbeitsverzeichnis befinden. Wenn Sie einen Interpreter über die Befehlszeile starten, ist das aktuelle Verzeichnis, in dem Sie arbeiten, dasselbe, in dem Sie ipython gestartet haben. Wenn Sie ausführen

import os
os.getcwd() 

Sie werden sehen, dass dies wahr ist.

Angenommen, Sie verwenden ein ipython-Notizbuch, führen es aus os.getcwd()und Ihr aktuelles Arbeitsverzeichnis ist stattdessen der Ordner, in dem Sie das Notizbuch angewiesen haben, in Ihrer Datei ipython_notebook_config.py zu arbeiten (normalerweise unter Verwendung der c.NotebookManager.notebook_dirEinstellung).

Die Lösung besteht darin, dem Python-Interpreter den Pfad zu Ihrem Modul bereitzustellen. Die einfachste Lösung besteht darin, diesen Pfad an Ihre sys.path-Liste anzuhängen. Versuchen Sie zunächst in Ihrem Notizbuch:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

Wenn dies nicht funktioniert, haben Sie ein anderes Problem in den Händen, das nicht mit dem Pfad zum Import zusammenhängt, und Sie sollten weitere Informationen zu Ihrem Problem bereitstellen.

Der bessere (und dauerhaftere) Weg, dies zu lösen, besteht darin, Ihren PYTHONPATH festzulegen , der dem Interpreter zusätzliche Verzeichnisse zur Verfügung stellt, in denen nach Python-Paketen / Modulen gesucht wird. Das Bearbeiten oder Festlegen des PYTHONPATH als globale Variable ist os-abhängig und wird hier für Unix oder Windows ausführlich erläutert .

Tyleha
quelle
1
PSA: Wenn Sie zu dieser SO-Frage gekommen sind, weil dieser Fehler in jupyter-notebook auftritt, siehe unten, stackoverflow.com/a/27944947/127971 Leider ist die Frage nicht spezifisch genug für eine einzelne Antwort.
Michael
@michael Bei dieser Antwort geht es im Allgemeinen um den Import von Python-Modulen. Die Datei dunder init.py wird benötigt, wenn der Interpreter Verzeichnisse nach zu importierenden Modulen durchsucht, ob Notebook oder nicht. Die obige Antwort zum Arbeitsverzeichnis des Notebook-Interpreters und zur Einstellung von PYTHONPATH ist korrekt.
BoltzmannBrain
Ich habe gesagt, dass es aufgrund des Wortlauts der Frage mehrere richtige Antworten geben wird. Ich impliziere nicht, dass diese Antwort nicht korrekt ist. Aber wenn Sie ein Jupyter-Notebook verwenden, berühren Sie einfach die Datei __init_.py, oder? ... und nicht ändern PYTHONPATHoder aufrufen wollen sys.path.append, auch wenn sie auch korrekt sind (richtig?). Ich meine, ich habe Dutzende von Verzeichnissen mit Code in ihnen, und ich werde sie nicht alle zum Pfad hinzufügen - oder andere Benutzer zu ihrer Jupyter-Konfigurationsdatei erwarten, selbst wenn es sich um ein Verzeichnis handelt.
Michael
16

Erstellen Sie einfach eine leere Python-Datei mit dem Namen __init__.pyunter dem Ordner, in dem Fehler angezeigt werden, während Sie das Python-Projekt ausführen.

Mohideen bin Mohammed
quelle
1
Mit ' init.py ' meinen Sie '_ init_ .py', richtig? Ich habe die _ init_ .py als leere Datei erstellt und es hat bei mir funktioniert. Vielen Dank. Aber warum wird das benötigt? Vorher hatte ich ein Python-Skript im selben Verzeichnis wie mein ipython-Notizbuch und der Import funktionierte einwandfrei.
Eduardo Reis
3
tatsächlich init Py verwendet wird , um anzuzeigen , Python , um anzuzeigen , dass ein Paket in dieser entsprechenden Position enthält , ist. dann findet nur es Submodule, was auch immer Sie darunter erstellt haben. Wenn Sie ' init .py' nicht erstellen, bedeutet Python, dass Sie nicht wissen, dass sich ein Paket darin befindet. Beispiel: Aus "Myfolder.Mypackage import Mymodules" sollten Sie beispielsweise init .py initiieren , um Python anzugeben und zu erkennen, dass hier ein Paket vorhanden ist. sonst weiß es nicht.
Mohideen bin Mohammed
1
Ja, perfekte Antwort. Das wird in Python 2.7 benötigt, aber beachten Sie in der 3
Agape Gal'lo
Dies hat das Problem in Python 3 für mich behoben.
Rick unterstützt Monica
Das Problem wurde auch für mich behoben - unter Verwendung eines Jupyter-Notebooks mit Python-Quelle im Unterverzeichnis der ipynb-Datei; zB foo.ipynbmit bar/baz.py, leere bar/__init__.pyDatei hinzufügen , damit Notebook verwenden kannfrom bar.baz import MyClass
Michael
12

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.pathwar zwischen den beiden Dolmetschern unterschiedlich. Um das Problem zu beheben, habe ich Python 3.3 entfernt.

z0r
quelle
Nachdem ich Miniconda verwendet hatte, um eine Reihe von Python-bezogenen Dingen zu installieren, bekam ich auch genau dieses Problem. Das gebündelte Ubuntu Python 2.7 unterscheidet sich vom Miniconda Python 2.7. Diese Antwort erlaubte mir, das Problem zu beheben
bph
4
Das war mein Problem. Ich hatte ein Upgrade auf Python 2.7.11 durchgeführt, aber meine interaktive iPython-Shell verwendete immer noch 2.7.5. Ich musste nur laufen pip install --upgrade ipython, um die neueste Version zu erhalten, und dann wurde standardmäßig automatisch 2.7.11 verwendet.
Abundnce10
Mein IPython ist 7.4.0, während es überhaupt keine solche Python-Version gibt.
Aderchox
@aderchox Führen Sie dies in ipython aus, um die Interpreter-Version zu erhalten:import sys; sys.version
z0r
7

Der Hauptgrund ist, dass die sys.paths von Python und IPython unterschiedlich sind.

Bitte beziehen Sie sich auf lucypark Link , die Lösung funktioniert in meinem Fall. Es passiert, wenn opencv von installiert wird

conda install opencv

Und es wurde ein Importfehler in iPython festgestellt. Es gibt drei Schritte, um dieses Problem zu beheben:

import cv2
ImportError: ...

1. Überprüfen Sie den Pfad in Python und iPython mit dem folgenden Befehl

import sys
sys.path

Sie finden andere Ergebnisse als Python und Jupyter. Im zweiten Schritt sys.path.append korrigieren Sie einfach den fehlenden Pfad durch Ausprobieren.

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 den ersten Anhang 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

Jesse
quelle
'ipython profile create' .... Ja! Dies ist die einzige (permanente) Lösung, die sich mit Jupyter-Notebooks befasst, die nicht aus der Umgebung PATH und PYTHONPATH lesen ... ohne auf unordentliche sys.path-Anweisungen am Anfang jeder Datei (yuk) zurückzugreifen. danke @jesse.
JohnL_10
6

Dies sys.path.append('my-path-to-module-folder')funktioniert, aber um zu vermeiden, dass Sie dies in IPython jedes Mal tun müssen, wenn Sie das Modul verwenden möchten, können Sie export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"es Ihrer ~/.bash_profileDatei hinzufügen .

acannon828
quelle
2

Vor der Installation von ipython habe ich Module über easy_install installiert. sagen sudo easy_install mechanize.

Nach der Installation von ipython musste ich easy_install erneut ausführen, damit ipython die Module erkennt.

Pandorabob
quelle
2

Hatte ein ähnliches Problem, behebt es durch Aufrufen python3statt python, meine Module waren in Python3.5.

peter n
quelle
2

Wenn Sie es über die Befehlszeile ausführen, kennt der Python-Interpreter manchmal nicht den Pfad, in dem nach Modulen gesucht werden soll.

Unten ist die Verzeichnisstruktur meines Projekts:

/project/apps/..
/project/tests/..

Ich lief unter Befehl:

>> cd project

>> python tests/my_test.py

Nachdem ich über dem Befehl ausgeführt habe, habe ich den folgenden Fehler erhalten

no module named lib

lib wurde in my_test.py importiert

Ich habe sys.path gedruckt und herausgefunden, dass der Pfad des Projekts, an dem ich arbeite, nicht in der sys.path-Liste verfügbar ist

Ich habe den 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.

Raghav Salotra
quelle
Dies funktioniert, wenn Sie das Skript immer am selben Speicherort ausführen. Andernfalls treten Probleme auf, da os.getcwd()das Verzeichnis abgerufen wird, in dem das Skript ausgeführt wurde, und nicht das Verzeichnis, in dem sich die Skriptdatei befindet.
Nathan Arthur
1

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)
pomber
quelle
1

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 Shell-Befehle wie folgt ausgeben:

!{sys.executable} -m pip install numpy

Bitte überprüfen Sie den obigen Link für eine maßgebliche vollständige Antwort.

Rui Guerra
quelle
0

Ich habe noch eine weitere Quelle für diese Diskrepanz gefunden:

Ich habe ipython sowohl lokal als auch allgemein in virtualenvs installiert. Mein Problem war, dass in einer neu erstellten virtuellen Umgebung mit ipython die System-ipython aufgenommen wurde, die eine andere Version als die Python und ipython in der virtuellen Umgebung war (2.7.x vs. 3.5.x), und es kam zu Heiterkeit.

Ich denke, die kluge Sache, die Sie tun müssen, wenn Sie etwas installieren, in dem sich eine Binärdatei yourvirtualenv/binbefindet, ist, sofort rehashoder ähnlich für die von Ihnen verwendete Shell auszuführen , damit das richtige Python / Ipython gefunden wird. (Muss überprüfen, ob es geeignete pipHaken nach der Installation gibt ...)

Kaleissin
quelle
0

Lösung ohne Scripting:

  1. Öffnen Sie den Spyder -> Tools -> PYTHONPATH-Manager
  2. Fügen Sie Python-Pfade hinzu, indem Sie auf "Pfad hinzufügen" klicken. Beispiel: 'C: \ Benutzer \ Benutzer \ AppData \ Lokal \ Programme \ Python \ Python37 \ Lib \ Site-Pakete'
  3. Klicken Sie auf "Synchronisieren ...", damit andere Programme (z. B. Jupyter Notebook) die in Schritt 2 festgelegten Pythonpfade verwenden können.
  4. Starten Sie Jupyter neu, wenn es geöffnet ist
Wen
quelle
0

Dies wird wahrscheinlich durch verschiedene auf Ihrem System installierte Python-Versionen verursacht , z. B. Python2 oder Python3 .

Führen Sie Befehl $ pip --versionund $ pip3 --versionzu prüfen , welche pip von an ist Python 3x . ZB sollten Sie Versionsinformationen wie folgt sehen:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Führen Sie dann das example.pySkript mit dem folgenden Befehl aus

$ python3 example.py
shizhen
quelle
0

Ist mir mit dem Verzeichnis passiert utils. Ich habe versucht, dieses Verzeichnis wie folgt zu importieren:

from utils import somefile

utilsist bereits ein Paket in Python. Ändern Sie einfach Ihren Verzeichnisnamen in etwas anderes und es sollte gut funktionieren.

subtleseeker
quelle
0

Diese Art von Fehlern tritt höchstwahrscheinlich aufgrund von Python-Versionskonflikten auf. Wenn Ihre Anwendung beispielsweise nur auf Python 3 ausgeführt wird und Sie auch Python 2 haben, ist es besser anzugeben, welche Version verwendet werden soll. Zum Beispiel verwenden

python3 .....

anstatt

python
Nu-ONE
quelle
0

Diese Antwort gilt für diese Frage, wenn

  1. Sie möchten Ihren Code nicht ändern
  2. Sie möchten PYTHONPATH nicht dauerhaft ändern

PYTHONPATH vorübergehend ändern

Pfad unten kann relativ sein

PYTHONPATH=/path/to/dir python script.py
kon psych
quelle
0

import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta

Shiva Kumar
quelle
-1

Entfernen Sie es pathlibund installieren Sie es erneut. Löschen Sie die Pfadliste im sitepackagesOrdner und installieren Sie das Pfadlistenpaket mit dem Befehl pip neu:

pip install pathlib
user3233042
quelle