Hallo, mein Name ist somenzz, du kannst mich Bruder Zheng nennen.
Pythons Import ist sehr intuitiv, aber trotzdem werden Sie manchmal feststellen, dass wir immer noch auf ModuleNotFoundError stoßen, obwohl der relative Pfad sehr korrekt ist.
ImportError: attempted relative import with no known parent package
Beim Importieren eines Moduls Im selben Verzeichnis sind die Module in verschiedenen Verzeichnissen völlig unterschiedlich. In diesem Artikel werden einige Probleme analysiert, die bei der Verwendung des Imports häufig auftreten. Auf dieser Grundlage können Sie ganz einfach Ihr eigenes Paket erstellen.
Die Beziehung zwischen Modulen und Paketen kann mit Dateien und Verzeichnissen verglichen werden.
Die Python-Dokumentation beschreibt dies, eine Python-Datei ist ein Modul und der Python-Dateiname (ohne das Suffix .py) ist der Modulname.
Ein Modul kann Variablen, Funktionen und Klassen enthalten, die Teil des vom Modul definierten Namensraums sind, sodass die Benennung von Variablen kein Problem darstellt, da zwei verschiedene Module Variablen, Funktionen und Klassen mit demselben Namen haben können.
Die Beziehung zwischen Modulen und Paketen kann mit Dateien und Verzeichnissen verglichen werden. Ein Paket ist ein Verzeichnis.
Ein Paket kann Module oder Unterpakete enthalten. Ein Modul definiert einen Namensraum, sodass Variablen, Funktionen und Klassen in zwei verschiedenen Modulen denselben Namen haben können. Auf das Hauptpaket kann über den Punkt zugegriffen werden .
Ein Basispaket kann Unterpakete, Module, __init__.py (nicht erforderlich nach Python 3.3) und setup.py enthalten. Eine mögliche Paketstruktur sieht so aus:
Und setup.py existiert im Home-Verzeichnis, in dem sich Ihr Paket befindet, und enthält Konfigurationsinformationen wie erforderliche Abhängigkeiten, Skripte und Unterpakete. Sie können auch Metadaten zum Paket angeben, z. B. den Namen, den Autor, die Beschreibung usw. des Pakets.
setup.py ist die Datei, die pip zur Installation Ihres Pakets verwendet.
#file1.py print("This is file1.py") #file2.py print("This is file2.py") import file1
Das Ausführen von file2.py kann zu den folgenden Ergebnissen führen:
❯ python file2.py This is file2.py This is file1.py
Es ist ersichtlich, dass:
Import sehr intuitiv ist, jeder, der es verwendet, kann importieren.Wenn ich beispielsweise am Ende von file2.py eine Codezeile hinzufüge: import sys; print(sys.path), kann der Suchpfad des Imports gedruckt werden:
Sie können die Reihenfolge sehen sys.path:
wird zuerst den Pfad suchen, in dem sich das Ausführungsskript befindetIn der Interpreterumgebung ist sys.path[0] der Startpfad des Interpreters.
Dann wird das zu importierende Projekt zu seinem Namensraum hinzugefügt und wir können es über xx.yy verwenden.
3. Wann sollte der relative Import und wann der absolute Import verwendet werden? Schauen wir uns zunächst an, was der absolute Import ist:
import aa import aa.bb from aa import bb
Schauen wir uns an, was relativer Import ist. Der sogenannte relative Import hat die Form:
from . import aa from .aa import bb from .. import yy
Das heißt, es gibt ein Zeichen im relativen Pfad, das die relative Position des Moduls angibt importiert oder das aktuelle Paket.
Zum Beispiel erstellen wir ein neues Verzeichnis subpackage1 unter dem Verzeichnis pythonimportexample und erstellen zwei neue Dateien file3.py und file4.py in subpackage1.
Der Inhalt ist wie folgt:
file3.py :print("This is file3.py")
file4.py :
from . import file3 print("This is file4.py")
只要我们直接运行 file4.py,那是一定会报错的:
Python 提示我们:
ImportError: attempted relative import with no known parent package
也就是说相对导入不知道父包是谁,换句话说,这是一个子包,必须让父包来调用它,直接运行这个文件是不行的,即使你在 file4.py 的目录 subpackage1 同级的目录执行该文件也是不行的,见上图。
但是在 file4.py 的目录 subpackage1 同级的目录作为一个 module 来执行是可以的,如下图:
换句话说,我们把 subpackage1 作为一个包来让别人用,相对导入是可以的,比如说我们在目录 subpackage1 同级的目录新建一个 file5.py 的文件,内容如下:
file5.py:
from subpackage1 import file4。
然后,执行 python file5.py 可以看出,相对导入已经正常工作:
结论
先上一个图来看下目录及引用结构,方块的是目录,椭圆的是文件,曲线是引用:
其中 import_example 目录下有 setup.py 和 run.py
run.py 导入了 file4、file5、file6。
file4 导入了 file3,file5 导入了 file3。
file6 导入了 file2,file2 导入了 file1。
现在我们来执行一下 run.py 看下效果:
可以看出所有相对导入都已正常工作,虽然 file3 被导入了两次,但只执行了一次,说明 Python 内部已经考虑了同一个包的多重导入问题。
自定义包就是让其他文件导入使用的,因此 pythonimportexample目录下都使用相对导入,源代码见:
https://gitee.com/somenzz/code-example/tree/master/import_example
点阅读原文也可以直接访问。
这里还有一些自定义包的例子:
本文分享了什么是模块(module),什么是包(package),import 的搜索路径,也分享了相对导入和绝对导入的区别,最后举了一个非常实用的 import 例子,方便你构建自己的包。
Das obige ist der detaillierte Inhalt vonWie funktioniert der Import von Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!