628 Stimmen

Python-Fehler "ImportError: No module named"

Python wird in einem lokalen Verzeichnis installiert.

Mein Verzeichnisbaum sieht wie folgt aus:

(local directory)/site-packages/toolkit/interface.py

Mein Code ist hier drin:

(local directory)/site-packages/toolkit/examples/mountain.py

Um das Beispiel auszuführen, schreibe ich python mountain.py und im Code habe ich:

from toolkit.interface import interface

Und ich erhalte die Fehlermeldung:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Ich habe bereits geprüft sys.path und dort habe ich das Verzeichnis /site-packages . Außerdem habe ich die Datei __init__.py.bin im Toolkit-Ordner, um Python zu zeigen, dass es sich um ein Paket handelt. Ich habe auch eine __init__.py.bin im Verzeichnis examples.

Ich weiß nicht, warum Python die Datei nicht finden kann, wenn sie sich in sys.path . Irgendwelche Ideen? Kann es ein Berechtigungsproblem sein? Brauche ich eine Ausführungserlaubnis?

4 Stimmen

Vergewissern Sie sich, dass Sie von Python aus Leserechte für diese Datei haben. Siehe: stackoverflow.com/a/20999950/1657225

2 Stimmen

Bitte achten Sie darauf, Ihr Verzeichnis als "Resources Root" zu markieren, damit PyCharm weiß, dass es sich um ein Paket handelt.

0 Stimmen

Das Problem in meinem Fall war, dass es die Erlaubnis gab, neu installierte Module nicht 755 . Der Grund dafür war umask auf der Maschine war 0027 aufgrund derer die others hatte nicht read Berechtigung, wodurch das Modul nicht gelesen werden kann. Hinzufügen von read Erlaubnis mein Problem behoben. Es lohnt sich, die Berechtigung des Zielverzeichnisses nach der Installation zu überprüfen.

327voto

John Fouhy Punkte 39035

Ausgehend von Ihren Kommentaren zum Beitrag von orip vermute ich, dass dies der Fall war:

  1. Sie bearbeiteten __init__.py unter Windows.
  2. Der Windows-Editor hat etwas nicht-druckendes hinzugefügt, vielleicht ein Carriage-Return (Zeilenende in Windows ist CR/LF; in Unix ist es nur LF), oder vielleicht ein CTRL-Z (Windows-Dateiendung).
  3. Sie haben WinSCP verwendet, um die Datei auf Ihre Unix-Box zu kopieren.
  4. WinSCP dachte: "Hier steht etwas, das kein einfacher Text ist; ich füge eine .bin-Erweiterung hinzu, um binäre Daten anzuzeigen."
  5. Die fehlende __init__.py (jetzt genannt __init__.py.bin ) bedeutet, dass Python Toolkit nicht als Paket versteht.
  6. Sie erstellen __init__.py im entsprechenden Verzeichnis und alles funktioniert... ?

65 Stimmen

Auch python -c 'import sys; print sys.path' hilft - manchmal hat der Benutzer die Dateien in einem nicht gescannten Pfad abgelegt.

2 Stimmen

Ich verwende dasselbe, nur dass WinSCP nicht an die .bin .

16 Stimmen

Wenn ich eine leere "__init__.py" habe, passiert dann dasselbe?

105voto

Specterace Punkte 855

Ich hatte ein ähnliches Problem, als ich diese Übung in LPTHW durchführte; ich konnte Python nie dazu bringen, zu erkennen, dass ich Dateien in dem Verzeichnis hatte, aus dem ich aufrief. Aber am Ende konnte ich es doch zum Laufen bringen. Was ich getan habe, und was ich empfehle, ist, dies zu versuchen:

(HINWEIS: Aus Ihrem anfänglichen Posting entnehme ich, dass Sie einen *NIX-basierten Rechner verwenden und die Dinge von der Kommandozeile aus ausführen, daher ist dieser Ratschlag darauf zugeschnitten. Da ich Ubuntu verwende, habe ich dies getan)

  1. Wechseln Sie das Verzeichnis (cd) in das Verzeichnis über das Verzeichnis, in dem sich Ihre Dateien befinden. In diesem Fall versuchen Sie, das Programm mountain.py Datei, und der Versuch, die toolkit.interface.py Modul, die sich in separaten Verzeichnissen befinden. In diesem Fall würden Sie in das Verzeichnis gehen, das die Pfade zu diesen beiden Dateien enthält (oder mit anderen Worten, in das nächstgelegene Verzeichnis, das die Pfade dieser beiden Dateien gemeinsam haben). Das ist in diesem Fall das Verzeichnis toolkit Verzeichnis.

  2. Wenn Sie sich in der toolkit Verzeichnis, geben Sie diese Codezeile in Ihre Befehlszeile ein:

    export PYTHONPATH=.

    Dies setzt Ihren PYTHONPATH auf ".", was im Grunde bedeutet, dass Ihr PYTHONPATH nun nach allen aufgerufenen Dateien innerhalb des Verzeichnisses, in dem Sie sich gerade befinden, sucht (und zwar im Verzeichnis Unterverzeichnisse des Verzeichnisses, in dem Sie sich befinden. Es wird also nicht nur in Ihrem aktuellen Verzeichnis gesucht, sondern in allen Verzeichnissen, die in Ihr aktuelles Verzeichnis).

  3. Nachdem Sie Ihren PYTHONPATH im obigen Schritt festgelegt haben, führen Sie Ihr Modul von Ihrem aktuellen Verzeichnis aus (die toolkit Verzeichnis). Python sollte nun die von Ihnen angegebenen Module finden und laden.

Ich hoffe, das hilft. Ich war selbst ziemlich frustriert über dieses Problem.

7 Stimmen

Oder unter Windows set PYTHONPATH=. .

1 Stimmen

Das hat bei mir funktioniert. Außerdem hat es meine PYTHONPATH Frustrationen VOLLSTÄNDIG vereinfacht, da ich es jedes Mal auf einen absoluten Pfad aktualisieren musste, wenn ich den Rechner wechselte. Thankyouthankyouthankyou.

0 Stimmen

Seien Sie vorsichtig, wenn Sie Verweise auf Bibliotheken von Drittanbietern oder eigene Bibliotheken in einer bereits vorhandenen PYTHONPATH Umgebungsvariable. Wenn Sie stattdessen den Lauf durchführen: set PYTHONPATH=%PYTHONPATH%;.; zum Anhängen . zum PYTHONPATH y luego echo %PYTHONPATH% die Folgendes anzeigen sollte path\to\custom\library;.; . Führen Sie dann Ihre Anwendung aus dem Anwendungsverzeichnis mit python applicationlaunchfile.py .

97voto

igorgue Punkte 17076

Hat

(local directory)/site-packages/toolkit

haben eine __init__.py ?

Zum Importieren Spaziergang durch Ihre Verzeichnisse muss jedes Verzeichnis einen __init__.py Datei.

1 Stimmen

Gutes Argument! Bemerkung: Seit Python 3.3 wird jedes Verzeichnis in sys.path mit einem Namen, der dem Paketnamen entspricht, erkannt.

9 Stimmen

Ist dies nicht nur bei relativen Pfadverweisen erforderlich? warum debe Jedes Verzeichnis hat es?

47voto

Renaud Punkte 15064

Unter *nix müssen Sie außerdem sicherstellen, dass der PYTHONPATH korrekt konfiguriert ist, insbesondere dass er dieses Format hat:

 .:/usr/local/lib/python

(Beachten Sie die .: am Anfang, so dass es auch im aktuellen Verzeichnis suchen kann).

Je nach Version kann sie sich auch an anderen Stellen befinden:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6 Stimmen

Sie kann auch sein .:/usr/lib/python , .:/usr/lib/python2.6 , .:/usr/lib/python2.7 und usw. je nach Version

0 Stimmen

Bei mir befindet sich das Modul in /usr/local/lib/python3.4/dist-packages, aber wenn ich python3 im Terminal (ubuntu) eingebe und versuche, es zu importieren, lässt es mich nicht zu, weil es nicht existiert. "ImportError: no module x exists"

0 Stimmen

Hinzufügen von #!/usr/bin/python am Ende einer Datei sollte doch auch funktionieren, oder?

46voto

avp Punkte 2312

Sie lesen diese Antwort, die besagt, dass Ihr __init__.py an der richtigen Stelle ist, Sie alle Abhängigkeiten installiert haben und trotzdem die Meldung ImportError .

Ich war mit einem ähnlichen Problem konfrontiert, außer dass mein Programm würde gut laufen, wenn mit PyCharm ausgeführt, aber die oben genannten Fehler, wenn ich es aus dem Terminal ausführen würde. Nachdem ich weiter gegraben hatte, fand ich heraus, dass PYTHONPATH den Eintrag für das Projektverzeichnis nicht hatte. Also habe ich PYTHONPATH per Import-Anweisung funktioniert in PyCharm, aber nicht im Terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Es gibt eine weitere Möglichkeit, dies zu tun, indem man sys.path als:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Sie können einfügen/anhängen in der Reihenfolge verwenden, in der Sie Ihr Projekt durchsuchen möchten.

2 Stimmen

Das habe ich als Abhilfe getan. Aber ich verstehe immer noch nicht, warum dies notwendig sein sollte. Ich habe in meinem Pipfile ein Modul mit relativem Pfad, das ohne diese Abhilfe nicht erkannt werden kann (z. B. erhalte ich den ImportError).

3 Stimmen

Das ist großartig. Ein allgemeiner Weg, ihn anzuwenden, wenn man sicher ist, dass man auf dem richtigen Weg ist: sys.path.append(os.getcwd())

1 Stimmen

Das ist in der Tat ein Lebensretter

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X