Dies ist das erste Mal, dass ich mich wirklich hingesetzt und Python 3 ausprobiert habe und kläglich versage. Ich habe die folgenden zwei Dateien:
- test.py
- config.py
In config.py sind einige Funktionen sowie einige Variablen definiert. Ich habe es auf Folgendes reduziert:
config.py
debug = True
test.py
import config
print (config.debug)
Ich habe auch eine __init__.py
Ich erhalte jedoch den folgenden Fehler:
ModuleNotFoundError: No module named 'config'
Mir ist bewusst, dass die py3-Konvention absolute Importe verwendet:
from . import config
Dies führt jedoch zu folgendem Fehler:
ImportError: cannot import name 'config'
Ich weiß also nicht, was ich hier tun soll ... Jede Hilfe wird sehr geschätzt. :) :)
python
python-3.x
package
python-import
relative-import
Blitzmann
quelle
quelle
python test.py
, und es funktioniert einwandfrei. Ich habe kein pyCharm, aber vielleicht ist eine schlechte Konfiguration von pyCharm, die das Problem verursachtAntworten:
TL; DR: Sie können keine relativen Importe aus der von Ihnen ausgeführten Datei durchführen , da das
__main__
Modul nicht Teil eines Pakets ist.Absolute Importe - Importieren Sie etwas, das auf verfügbar ist
sys.path
Relative Importe - Importieren Sie etwas relativ zum aktuellen Modul, das Teil eines Pakets sein muss
Wenn Sie beide Varianten genau gleich ausführen, sollte eine davon funktionieren. Wie auch immer, hier ist ein Beispiel, das Ihnen helfen soll zu verstehen, was los ist. Fügen wir eine weitere
main.py
Datei mit der gesamten Verzeichnisstruktur wie folgt hinzu :Und aktualisieren wir test.py, um zu sehen, was los ist:
Lassen Sie uns zuerst test.py ausführen:
Hier „Test“ ist das
__main__
Modul und weiß nichts über zu einem Paket gehört. Sollteimport config
jedoch funktionieren, da derryan
Ordner zu sys.path hinzugefügt wird.Lassen Sie uns stattdessen main.py ausführen:
Und hier befindet sich der Test innerhalb des "Ryan" -Pakets und kann relative Importe durchführen.
import config
schlägt fehl, da implizite relative Importe in Python 3 nicht zulässig sind.Hoffe das hat geholfen.
PS: Wenn Sie bei Python 3 bleiben, werden
__init__.py
Dateien nicht mehr benötigt .quelle
sys.path.append('/some/path/my_module')
innerhalb von/some/path/my_module/__init__.py
?sys.path
Laufzeit vorzunehmen ( github.com/… ). Sie können auch die Umgebungsvariable PYTHONPATH festlegen.__init__.py
Dateien nicht mehr benötigt ." Interessant. Können Sie das näher erläutern? Ich hatte den Eindruck, dass sich der Mechanismus zur Paketauflösung zwischen 2 und 3 nicht allzu sehr geändert hat.__init__.py
Dateien mehr benötigt ." Können Sie umgekehrt beschreiben, ob ein Paket sowohl in 2 als auch in 3 funktionieren soll? Und sehen Sie sich das leider veraltete Jahr 2009 an. Wofür ist das__init__.py
? und seine am besten bewertete Antwort "Es ist ein Teil eines Pakets" . Wir müssen überall und oft die Unterscheidung zwischen "regulärem Paket [alt, vor 3.3]" und "Namespace-Paket [3.3+]" hervorheben .Ich habe es herausgefunden. Sehr frustrierend, besonders wenn man von Python2 kommt.
Sie müssen
.
dem Modul ein hinzufügen , unabhängig davon, ob es relativ oder absolut ist.Ich habe das Verzeichnis wie folgt erstellt.
modx.py.
mody.py.
main.py.
Wenn ich main ausführe, passiert Folgendes
Ich lief 2to3, und die Kernausgabe war dies
Ich musste die Importanweisung von mody.py ändern, um das Problem zu beheben
Dann habe ich main.py erneut ausgeführt und die erwartete Ausgabe erhalten
Zum Schluss nur, um es aufzuräumen und zwischen 2 und 3 tragbar zu machen.
quelle
try/except
Ladeverfahren die eigentliche Zutat ist, die hier funktioniert (wie einige Leute verwenden müssentry:scripts.modx
undexcept: modx
), und was dieses Problem für mich gelöst hat.Das Einstellen von PYTHONPATH kann ebenfalls bei diesem Problem helfen.
So geht's unter Windows
set PYTHONPATH=.
quelle
Sie müssen den Pfad des Moduls anhängen
PYTHONPATH
.Für UNIX (Linux, OSX, ...)
Für Windows
quelle
Versuchte dein Beispiel
Das wird bei mir funktionieren:
Getestet mit Python: 3.4.2 - PyCharm 2016.3.2
Außerdem bietet Ihnen PyCharm an, diesen Namen zu importieren .
Sie müssen darauf klicken
config
und ein Hilfesymbol wird angezeigt.quelle
Sie können einfach die folgende Datei zu Ihrem Testverzeichnis hinzufügen, und Python führt sie dann vor den Tests aus
quelle
Legen Sie die
PYTHONPATH
Umgebungsvariable im Stammprojektverzeichnis fest.In Anbetracht von UNIX-ähnlich:
quelle
Dieses Beispiel funktioniert unter Python 3.6.
Ich schlage vor,
Run -> Edit Configurations
in PyCharm zu gehen, dort alle Einträge zu löschen und zu versuchen, den Code erneut über PyCharm auszuführen.Wenn dies nicht funktioniert, überprüfen Sie Ihren Projektinterpreter (Einstellungen -> Projektinterpreter) und führen Sie die Konfigurationsstandards aus (Ausführen -> Konfigurationen bearbeiten ...).
quelle
Deklarieren Sie die korrekte sys.path- Liste, bevor Sie das Modul aufrufen:
quelle
Wie in den Kommentaren zum ursprünglichen Beitrag angegeben, schien dies ein Problem mit dem Python-Interpreter zu sein, den ich aus irgendeinem Grund verwendete, und nicht mit den Python-Skripten. Ich habe vom WinPython-Bundle auf das offizielle Python 3.6 von python.org umgestellt und es hat einwandfrei funktioniert. danke für die hilfe an alle :)
quelle
Wenn Sie Python 3+ verwenden, fügen Sie die folgenden Zeilen hinzu
quelle
Versuchen
Damit wird aus derselben Ordnerebene importiert. Wenn Sie direkt versuchen zu importieren, wird davon ausgegangen, dass es sich um einen Untergebenen handelt
quelle