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?
Basierend auf Ihren Kommentaren zu orip's Post, denke ich, ist Folgendes passiert:
__init__.py
unter Windows bearbeitet.__init__.py
(jetzt __init__.py.bin
genannt) bedeutet, dass Python Toolkit nicht als Paket versteht.__init__.py
im entsprechenden Verzeichnis an und alles funktioniert ...?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.
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.
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.
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.
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
Wenn Sie ein Verzeichnis als Paket markieren möchten, benötigen Sie eine Datei mit dem Namen __init__.py
.
Mit PyCharm
(Teil der JetBrains-Suite) müssen Sie Ihr Skriptverzeichnis als Quelle definieren:Right Click > Mark Directory as > Sources Root
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
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.
Meine zwei Cent:
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.
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
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.
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.
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 .
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.
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.
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!
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.
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
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.
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:
Genießen.
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.
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.
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 ¯\_(ツ)_/¯
.
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