Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert der Import von Python?

Wie funktioniert der Import von Python?

王林
王林nach vorne
2023-05-15 20:13:041643Durchsuche

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.

1. Was ist ein Modul und was ist ein Paket?

Module

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.

Paket

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:

Python 的 import 是怎么工作的?

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.

Was beim 2. Import passiert ist? Nehmen wir zunächst ein einfaches Beispiel: Es gibt zwei Dateien im selben Verzeichnis, file1.py und file2.py. Drucken Sie einfach die jeweiligen Dateinamen aus. Der Unterschied besteht darin, dass Datei1 in Datei2.py importiert wird:

#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.
  • Die Importanweisung ist eine gewöhnliche Anweisung und kann überall platziert werden.
  • Wenn eine Datei importiert wird, wird sie ausgeführt und ihre internen Klassen oder Objekte werden ihrem Namespace hinzugefügt.
  • Wir müssen auch die Suchreihenfolge des Imports kennen. Denken Sie daran, dass der Import in sys.path sucht.

Wenn ich beispielsweise am Ende von file2.py eine Codezeile hinzufüge: import sys; print(sys.path), kann der Suchpfad des Imports gedruckt werden:

Python 的 import 是怎么工作的?Sie können die Reihenfolge sehen sys.path:

wird zuerst den Pfad suchen, in dem sich das Ausführungsskript befindet
  • Standardbibliothek
  • Site-Pakete für Bibliotheken von Drittanbietern
  • Was Sie bei sys.path beachten müssen, ist:

In der Interpreterumgebung ist sys.path[0] der Startpfad des Interpreters.
  • sys.path hängt nicht vom Arbeitspfad des aktuellen Programms ab – os.getcwd(), sondern nur davon auf dem Pfad, in dem sich das erste Skript befindet:

Python 的 import 是怎么工作的?

Wenn ein Modul ein anderes Modul importiert und dieses ein anderes Modul importiert, sucht der Interpreter im sys.path des ersten Moduls nach der zweiten Importanweisung.
  • Sobald ein Modul oder Paket gefunden wird, wird es ausgeführt. Wenn das Paket eine Initialisierungsdatei __init__.py enthält, wird __init__.py beim Importieren zuerst ausgeführt.

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

Diese Methode ist sehr intuitiv .path zur Suche. Wenn Sie auf ModuleNotFoundError stoßen, überlegen Sie, warum sys.path nicht über das Paket verfügt, das wir importieren möchten, oder fügen Sie den Pfad dieses Pakets manuell in sys.path ein.

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 的 import 是怎么工作的?

Python 提示我们:

ImportError: attempted relative import with no known parent package

也就是说相对导入不知道父包是谁,换句话说,这是一个子包,必须让父包来调用它,直接运行这个文件是不行的,即使你在 file4.py 的目录 subpackage1 同级的目录执行该文件也是不行的,见上图。

但是在 file4.py 的目录 subpackage1 同级的目录作为一个 module 来执行是可以的,如下图:

Python 的 import 是怎么工作的?

换句话说,我们把 subpackage1 作为一个包来让别人用,相对导入是可以的,比如说我们在目录 subpackage1 同级的目录新建一个 file5.py 的文件,内容如下:

file5.py:

from subpackage1 import file4。

然后,执行 python file5.py 可以看出,相对导入已经正常工作:

Python 的 import 是怎么工作的?

结论

  • 如果是当做脚本文件直接运行的,使用绝对导入。
  • 如果是当做模块供其他文件导入,使用相对导入。

4.一个自定义包的例子

先上一个图来看下目录及引用结构,方块的是目录,椭圆的是文件,曲线是引用:

Python 的 import 是怎么工作的?

其中 import_example 目录下有 setup.py 和 run.py

run.py 导入了 file4、file5、file6。

file4 导入了 file3,file5 导入了 file3。

file6 导入了 file2,file2 导入了 file1。

现在我们来执行一下 run.py 看下效果:

Python 的 import 是怎么工作的?

可以看出所有相对导入都已正常工作,虽然 file3 被导入了两次,但只执行了一次,说明 Python 内部已经考虑了同一个包的多重导入问题。

自定义包就是让其他文件导入使用的,因此 pythonimportexample目录下都使用相对导入,源代码见:

https://gitee.com/somenzz/code-example/tree/master/import_example

点阅读原文也可以直接访问。

这里还有一些自定义包的例子:

  • dbinterface[1]
  • transferfile[2]

最后的话

本文分享了什么是模块(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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen