webentwicklung-frage-antwort-db.com.de

Python-Fehler "ImportError: Kein Modul benannt"

Python ist in einem lokalen Verzeichnis installiert. 

Mein Verzeichnisbaum sieht so 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 bekomme den Fehler:

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 sys.path geprüft und habe dort das Verzeichnis /site-packages. Außerdem habe ich die Datei __init__.py.bin im Toolkit-Ordner, um Python mitzuteilen, dass dies ein Paket ist. Ich habe auch einen __init__.py.bin im Beispielverzeichnis.

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

351
Eduardo

Basierend auf Ihren Kommentaren zu orip's Post, denke ich, ist Folgendes passiert:

  1. Sie haben __init__.py unter Windows bearbeitet.
  2. Der Windows-Editor fügte etwas Nicht-Druckendes hinzu, vielleicht ein Wagenrücklauf (Zeilenende in Windows ist CR/LF; in Unix ist es nur LF) oder vielleicht eine CTRL-Z (Windows-Ende von -Datei).
  3. Sie haben WinSCP verwendet, um die Datei in Ihre Unix-Box zu kopieren.
  4. WinSCP dachte: "Dies hat etwas, was kein grundlegender Text ist; ich werde eine .bin-Erweiterung einfügen, um binäre Daten anzuzeigen."
  5. Der fehlende __init__.py (jetzt __init__.py.bin genannt) bedeutet, dass Python Toolkit nicht als Paket versteht.
  6. Sie legen __init__.py im entsprechenden Verzeichnis an und alles funktioniert ...?
223
John Fouhy

Tut

(local directory)/site-packages/toolkit

habe einen __init__.py?

Um import walk durch Ihre Verzeichnisse zu machen, muss jedes Verzeichnis eine __init__.py-Datei haben.

58
igorgue

Vergewissern Sie sich unter * nix, dass PYTHONPATH korrekt konfiguriert ist, insbesondere dass es folgendes Format hat:

 .:/usr/local/lib/python

(Beachten Sie den .: am Anfang, damit er auch im aktuellen Verzeichnis suchen kann.)

Es kann sich auch an anderen Orten befinden, je nach Version:

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

Ich bin auf etwas sehr Ähnliches gestoßen, als ich diese Übung in LPTHW machte. Ich konnte Python niemals dazu bringen, zu erkennen, dass sich Dateien in dem Verzeichnis befanden, aus dem ich anrief. Aber ich konnte es am Ende zum Laufen bringen. Was ich getan habe und was ich empfehle, ist dies zu versuchen:

(HINWEIS: Ich gehe davon aus, dass Sie in Ihrem ersten Beitrag einen * NIX-basierten Computer verwenden und Dinge von der Befehlszeile aus ausführen. Daher ist dieser Hinweis darauf zugeschnitten. Da ich Ubuntu betreibe, habe ich dies getan.) 

1) Wechseln Sie in das Verzeichnis (cd) in das Verzeichnis über das Verzeichnis, in dem sich Ihre Dateien befinden. In diesem Fall versuchen Sie, die Datei mountain.py auszuführen, und versuchen, das Modul toolkit.interface.py aufzurufen, das sich in separaten Verzeichnissen befindet. In diesem Fall würden Sie zu dem Verzeichnis wechseln, das Pfade zu diesen beiden Dateien enthält (oder mit anderen Worten, das nächste Verzeichnis, das die Pfade beider Dateien gemeinsam nutzen). Welches ist in diesem Fall das Verzeichnis toolkit.

2) Wenn Sie sich im Verzeichnis tookit befinden, geben Sie diese Codezeile in Ihre Befehlszeile ein:

export PYTHONPATH=.

Dadurch wird Ihr PYTHONPATH auf "." Gesetzt, was im Wesentlichen bedeutet, dass Ihr PYTHONPATH nun nach aufgerufenen Dateien in dem Verzeichnis sucht, in dem Sie sich gerade befinden (und mehr im Punkt Unterverzeichnis-Zweige des Verzeichnisses) Sie sind in. Sie suchen also nicht nur in Ihrem aktuellen Verzeichnis, sondern in allen Verzeichnissen, die in Ihr aktuelles Verzeichnis sind.

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

Hoffe das hilft. Ich war selbst ziemlich frustriert. 

30
Specterace

Ich habe mein eigenes Problem gelöst und schreibe eine Zusammenfassung der Fehler und die Lösung:

Die Datei muss genau __init__.py aufgerufen werden. Wenn die Erweiterung anders ist als in meinem Fall .py.bin, kann sich Python nicht durch die Verzeichnisse bewegen und die Module nicht finden. Um die Dateien zu bearbeiten, müssen Sie einen Linux-Editor verwenden, z. B. vi oder nano . Wenn Sie einen Windows-Editor verwenden, werden einige verborgene Zeichen geschrieben.

Ein anderes Problem war, dass ich eine andere Python-Version vom Root installiert habe. Wenn also jemand mit einer lokalen Installation von Python arbeitet, stellen Sie sicher, dass die Python-Installation, in der die Programme ausgeführt werden, die lokale Python-Version ist. Um dies zu überprüfen, führen Sie einfach which python aus und prüfen Sie, ob sich die ausführbare Datei in Ihrem lokalen Verzeichnis befindet. Wenn nicht, ändern Sie den Pfad. Stellen Sie jedoch sicher, dass das lokale Python-Verzeichnis vor dem anderen Python liegt.

22
Eduardo

eine einfache Lösung ist die Installation des Moduls mit python -m pip install <library-name> anstelle von pip install <library-name> Sie können Sudo im Falle von Administratorbeschränkungen verwenden

15
Badr Bellaj

Wenn Sie ein Verzeichnis als Paket markieren möchten, benötigen Sie eine Datei mit dem Namen __init__.py.

14
orip

Mit PyCharm (Teil der JetBrains-Suite) müssen Sie Ihr Skriptverzeichnis als Quelle definieren:
Right Click > Mark Directory as > Sources Root

11
MonoThreaded
  1. Die Datei __ init__.py muss sich in demselben Verzeichnis befinden, in dem sich die zu importierende Datei befindet.
  2. Sie können nicht versuchen, eine Datei mit demselben Namen zu importieren und eine Datei aus 2 Ordnern sein, die auf dem PYTHONPATH konfiguriert sind.

zB: /etc/environment

PYTHONPATH = $ PYTHONPATH:/opt/ordner1:/opt/ordner2

/ opt/ordner1/foo

/ opt/ordner2/foo

Wenn Sie versuchen, eine FOO-Datei zu importieren, wird Python nicht wissen, welche Datei Sie möchten.

von foo import ... >>> importerror: Kein Modul mit dem Namen foo

6
Iasmini Gomes

Jep. Das Verzeichnis muss die __init__.py-Datei enthalten. Dies ist die Datei, die das Paket initialisiert. Hier sehen Sie this .

Die __init__.py-Dateien sind erforderlich, damit Python die Verzeichnisse als Paket enthaltend behandelt. Dies geschieht, um zu verhindern, dass Verzeichnisse mit einem allgemeinen Namen, z. B. Zeichenfolge, gültige Module versehentlich ausblenden, die später im Modulsuchpfad auftreten. Im einfachsten Fall kann __init__.py nur eine leere Datei sein, sie kann jedoch auch einen Initialisierungscode für das Paket ausführen oder die später beschriebene Variable __all__ setzen.

6
miya

Meine zwei Cent:

enter image description here

Spucke:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Das verwirrte mich zum Teufel - ging durch Posts und Posts, die hässliche Syspath-Hacks nahelegten (wie Sie sehen, mein __init__.py waren alle da). Nun, es stellte sich heraus, dass game/oblivion.py und game/oblivion verwirrend waren python), was das wenig hilfreiche "No module named RecordGroups" ausspuckte. Ich wäre an einer Problemumgehung und/oder Links interessiert Dokumentation dieses (gleichnamigen) Verhaltens -> EDIT (2017.01.24) - siehe Was ist, wenn ich ein Modul und ein Paket mit demselben Namen habe? Interessanterweise normal Pakete haben Vorrang, aber anscheinend verstößt unser Launcher dagegen.

EDIT (2015.01.17): Ich habe nicht erwähnt, dass wir einen benutzerdefinierten Launcher dissected hier verwenden.

5
Mr_and_Mrs_D

Linux: Importierte Module befinden sich in /usr/local/lib/python2.7/dist-packages

Wenn Sie ein in C kompiliertes Modul verwenden, vergessen Sie nicht, die .so-Datei nach Sudo setup.py install zu ändern.

Sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
4
KrisWebDev

In meinem Fall bestand das Problem darin, dass ich mit debug python & boost::Python verlinkt habe. Dies erfordert, dass die Erweiterung FooLib_d.pyd und nicht nur FooLib.pyd; Umbenennen der Datei oder Aktualisieren der CMakeLists.txt-Eigenschaften wurde der Fehler behoben.

3
peter karasev

Mein Problem war, dass ich das Verzeichnis mit der Datei __init__.py zu PYTHONPATH hinzugefügt habe, als ich eigentlich das übergeordnete Verzeichnis hinzufügen musste. 

3
Rich

Wenn Sie alle oben angegebenen Methoden ausprobiert haben, aber fehlgeschlagen sind, hat Ihr Modul möglicherweise den gleichen Namen als ein eingebautes Modul. Oder ein Modul mit demselben Namen in einem Ordner, der eine hohe Priorität in sys.path hat als das in Ihrem Modul.

Zum Debuggen sagen Sie Ihre from foo.bar import baz-Beschwerden ImportError: No module named bar. Änderung in import foo; print foo, wodurch der Pfad von foo angezeigt wird. Erwartest du es?

Wenn nicht, benennen Sie entweder foo um oder verwenden Sie absolute importe .

2
liushuaikobe

Mein Problem wurde behoben, indem print (sys.path) geschrieben wurde und festgestellt wurde, dass Python trotz einer Neuinstallation veraltete Pakete verwendete. Beim Löschen dieser Python-Pakete werden automatisch die richtigen Pakete verwendet.

1
dukevin

Ich hatte den gleichen Fehler. Es wurde dadurch verursacht, dass jemand einen Ordner im selben Ordner wie mein Skript erstellte, dessen Name mit einem Modul in Konflikt stand, das ich von anderswo importierte. Anstatt das externe Modul zu importieren, hat es in diesem Ordner nachgesehen, der offensichtlich nicht die erwarteten Module enthielt.

0
Toivo Säwén

Das hat bei mir funktioniert: __init__.py-Datei im übergeordneten Ordner erstellt (in Ihrem Fall im site-packages-Ordner). Und so importiert:

from site-packages.toolkit.interface import interface

Hoffe, es wird auch für Sie nützlich sein!

0
Sherzod

Ich hatte das gleiche Problem (Python 2.7 Linux), ich habe die Lösung gefunden und möchte sie weitergeben. In meinem Fall hatte ich die folgende Struktur:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

In 'main.py' hatte ich erfolglos alle Kombinationen ausprobiert:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

Die Lösung war viel einfacher als ich dachte. Ich habe den Ordner "Booklet" in "Booklet" umbenannt und das war's. Jetzt kann Python die Klasse Question normalerweise importieren, indem der Code in 'main.py' verwendet wird:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Daraus kann ich schließen, dass Paketnamen (Ordner) wie 'booklet' mit Kleinbuchstaben beginnen müssen, andernfalls verwechselt Python es mit Klassennamen und Dateinamen.

Anscheinend war dies nicht dein Problem, aber die Antwort von John Fouhys ist sehr gut und dieser Thread hat fast alles, was dieses Problem verursachen kann. Das ist also noch eine Sache und ich hoffe, dass dies vielleicht anderen helfen könnte.

0
ioaniatr

Nachdem ich nur das gleiche Problem hatte, stellte ich fest, dass meine Lösung darin bestand, alle pyc -Dateien aus meinem Projekt zu löschen. Anscheinend haben diese zwischengespeicherten Dateien diesen Fehler verursacht.

Der einfachste Weg, dies zu tun, bestand darin, in Windows Explorer zu meinem Projektordner zu navigieren und nach *.pyc zu suchen und dann alle auszuwählen (Ctrl+A) und löschen (Ctrl+X).

Möglicherweise hätte ich meine Probleme lösen können, indem ich nur die pyc -Datei gelöscht habe, aber ich habe es nie versucht

0
Sayse

Ich stand vor demselben Problem: Import error. Außerdem wurde die Bibliothek zu 100% korrekt installiert. Die Ursache des Problems war, dass auf meinem PC 3 Version von Python (Anaconda-Paket) installiert wurde. Deshalb wurde die Bibliothek nicht an der richtigen Stelle installiert. Danach habe ich in meinem IDE PyCharm einfach die richtige Version von Python geändert.

0
Rocketq

In meinem Fall, weil ich PyCharm und PyCharm verwende, erstellen Sie für jedes Projekt im Projektordner einen 'venv', aber es ist nur eine kleine Umgebung von Python. Sie haben zwar die benötigten Bibliotheken in Python installiert, aber in Ihrem benutzerdefinierten Projekt 'venv' ist es nicht verfügbar. Dies ist der wahre Grund von 'ImportError: Es ist kein Modul mit dem Namen xxxxxx' in PyCharm aufgetreten. Um dieses Problem zu beheben, müssen Sie der benutzerdefinierten Projektumgebung folgende Bibliotheken hinzufügen:

  • In PyCharm im Menü 'Datei' -> Einstellungen
  • Im Einstellungsdialogfeld Projekt: XXXProjekt-> Projektinterpreter
  • Klicken Sie auf "Hinzufügen", um das Dialogfeld "Verfügbare Pakete" anzuzeigen
  • Durchsuchen Sie Ihre Bibliothek und klicken Sie auf "Paket installieren".
  • Dann werden alle benötigten Pakete in Ihrem benutzerdefinierten 'venv'-Ordner installiert.

 Settings dialog

Genießen.

0
Yuanhui

Sie lesen diese Antwort sagen, dass Ihr __init__.py am richtigen Ort ist, Sie haben alle Abhängigkeiten installiert und erhalten immer noch die ImportError.

Ich war mit einem ähnlichen Problem konfrontiert, mit der Ausnahme, dass mein Programm einwandfrei lief, wenn ich es mit PyCharm ausführte, aber es gab einen Fehler, wenn ich es vom Terminal aus ausführen würde. Nach weiterem Graben stellte ich fest, dass PYTHONPATH keinen Eintrag für das Projektverzeichnis hatte. Also habe ich das mit gesetzt 

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

Es gibt eine andere Möglichkeit, dies mit sys.path als zu tun:

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 Ihr Projekt gesucht werden soll.

HTH.

Quelle

0
avp

In meinem Fall habe ich den Pfad zum package.Egg-Ordner und nicht das eigentliche Paket darunter angegeben. Ich habe das Paket auf die oberste Ebene kopiert und es hat funktioniert.

0
Fakrudeen

Für mich war es etwas wirklich Dummes. Ich habe die Bibliothek mit pip3 install installiert, aber mein Programm wurde im Gegensatz zu python program.py als python3 program.py ausgeführt. Es ist manchmal so ¯\_(ツ)_/¯.

0
kev

An alle, die dieses Problem noch haben. Ich glaube, Pycharm wird mit Importen verwechselt. Wenn ich schreibe, dass 'etwas aus dem Namespace importiert wurde', wird die vorherige Zeile rot unterstrichen, was darauf hinweist, dass ein Fehler vorliegt, aber funktioniert. '' Aus .namespace importieren '' wird jedoch nicht unterstrichen, funktioniert aber auch nicht.

Versuchen

try:
    from namespace import something 
except NameError:
    from .namespace import something
0
AKJ