Lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen
coldplay.xixi
Freigeben: 2020-09-27 17:38:16
nach vorne
2808 Leute haben es durchsucht
In der heutigen Spalte „Python-Video-Tutorial“ lernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen.
Vorwort
Bei der Verwendung von Python in unseren täglichen Projekten müssen wir häufig das Importproblem jedes Moduls lösen und stoßen häufig auf Probleme wie das Finden des Referenzpfads, den Cross-Import von Modulen usw. Deshalb habe ich diesen Artikel geschrieben. Ziel dieses Artikels ist es, den Modulimportmechanismus von Python und die Modulimportspezifikationen zu beschreiben, die wir in täglichen Großprojekten befolgen sollten Kapselt den Code in Module, die bei Bedarf direkt importiert und wiederverwendet werden können, um unsere Entwicklungseffizienz zu verbessern.
Module können Funktionen, Klassen und Variablen definieren und auch ausführbaren Code enthalten. Es gibt drei Arten von Modulquellen:
①In Python integrierte Module (Standardbibliothek);
②Module von Drittanbietern;
③Benutzerdefinierte Module; ImportprinzipDer Import von Modulen erfolgt im Allgemeinen durch die Verwendung des Schlüsselworts
import
im Dateiheader. Das Importieren eines Moduls entspricht der einmaligen Ausführung des importierten Moduls und der anschließenden Erstellung eines Moduls in diesem Namensraum Die Verbindung des Modulnamensraums entspricht dem Erstellen einer neuen Variablen in diesem Namensraum. Der Name dieser Variablen ist der Name des importierten Moduls und verweist auf den Namensraum des importierten Moduls. Das importierte Modul entspricht also einer Variablen,
Daher wird das mehrmalige Importieren desselben Moduls nur dann ausgeführt, wenn es zum ersten Mal importiert wird
(Bei nachfolgenden Importen wird festgestellt, dass diese Modulvariable bereits vorhanden ist und nicht ausgeführt wird)
Pfadsuchmechanismus Jedes importierte Modul befindet sich im integrierten Python-Wörterbuch
sys.modules
Sobald Python startet, wird es automatisch in den Speicher geladen Nehmen Sie das Modul auf.
Der Modulsuchpfadmechanismus von Python lautet:
Überprüfen Sie, ob das Modul in allen Pfaden in
sys.path
vorhanden ist, und öffnen Sie in diesem Fall einen neuen Bereich zum Laden des Moduls. Überprüfen Sie, ob ein integriertes Paket vorhanden ist oder wurde in sys.modules installiert. Das installierte Paket eines Drittanbieters öffnet einen neuen Speicherplatz zum Laden des Moduls
Wenn das Modul, das wir selbst geschrieben haben, gekapselt und auf PyPi veröffentlicht wird, kann es direkt installiert werden mit pip install und beim Start in den Speicher geladen. Sie können es über sys.modules anzeigen
Für Module, die nur in diesem Projekt wiederverwendet werden müssen, fügen wir ihre Pfade zu sys.path im wiederverwendeten Code hinzu, und das Modul kann auch referenziert werden.
Absoluter Pfadimport
Alle Modulimporte beginnen am „Wurzelknoten“. Der Speicherort des Root-Knotens wird durch den Pfad in sys.path bestimmt. Das Root-Verzeichnis des Projekts befindet sich normalerweise automatisch in sys.path. Wenn Sie möchten, dass das Programm überall ausgeführt wird, müssen Sie sys.path manuell ändern. Es kann nicht direkt im Paket ausgeführt werden (es wird ein Fehler gemeldet). Unabhängig davon, wo sich der Wurzelknoten befindet, ist die relative Position der Module innerhalb des Pakets korrekt.
import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#项目根目录所在的绝对路径sys.path.append(BASE_DIR)import A, B #导入A、B包复制代码
Nach dem Login kopieren
FAQs zum Python-Modulimport
Beim Einzelimport eines Paketnamens werden nicht alle im Paket enthaltenen Submodule importiert.
Lösung: Das importierte Paket enthält auch Importe aus anderen Paketen. Zu diesem Zeitpunkt müssen Sie alle Module unter dem Paket in die Datei
init
.py importieren. Nur die oberste Ebene kann direkt auf die Klassen des unteren Pakets verweisen . und Methode
init
-Datei Wenn sich
init
.py unter einem Ordner befindet, bedeutet dies, dass der Ordner ein Paket ist und mehrere Module darunter ein Ganzes bilden und diese Module in andere importiert werden können Code über dasselbe Paket. Unter anderem wird die Datei init.py zum Organisieren von Paketen verwendet, um die Verwaltung von Referenzen zwischen verschiedenen Modulen zu erleichtern und das Importverhalten von Paketen zu steuern.
Die Datei darf keinen Inhalt enthalten, das heißt, es ist eine leere Datei (wenn sie leer ist, kann nichts getan werden, indem man einfach das Formular „Importieren“ [Paket] verwendet). Sie muss nur existieren, was einer Markierung entspricht .
In Python3 meldet das Importpaket keinen Fehler, auch wenn sich unter dem Paket keine
init
.py-Datei befindet. In Python2 muss sich die Datei unter dem Paket befinden, andernfalls meldet das Importpaket einen Fehler all
variables
all ist eine wichtige Variable, die verwendet wird, um anzugeben, welche Module in [den aktuellen Bereich] importiert werden, wenn dieses Paket importiert wird *. Module, die nicht in der all-Liste enthalten sind, werden von anderen Programmen nicht referenziert. Sie können all
umschreiben, z. B.
all= [‚Name des aktuellen Paketmoduls 1‘, ‚Name des Moduls 1‘]. Wenn Sie dies schreiben, wird es entsprechend dem Modulnamen in der Liste importiert
name变量
在包内部直接运行时,包的name == 'main',但是在外部导入包是,可以通过
if __name__ == '__main__':复制代码
Nach dem Login kopieren
来避免实现包内部调试时的逻辑
循环导入
当两个模块A和B之间相互import时,就会出现循环导入的问题,此时程序运行会报错:can not import name xxx,如:
# a.pyprint('from a.py')from b import x
y = 'a'复制代码
Nach dem Login kopieren
# b.pyprint('from b.py')from a import y
x = 'b'复制代码
Nach dem Login kopieren
我们来分析一下这种错误是怎么出现的:
在sys.modules中查找 符号“module b”;
如果符号“module b”存在,则获得符号“module b”对应的module对象;
从的dict中获得 符号“x”对应的对象。如果“x”不存在,则抛出异常“ImportError: cannot import name ‘x’”
Das obige ist der detaillierte Inhalt vonLernen Sie den Importmechanismus des Python-Moduls und die Spezifikationen großer Projekte kennen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn