Dieser Artikel führt Sie hauptsächlich in die Prinzipien und Methoden der Modulsuche in Python ein. Der Artikel bietet einen gewissen Referenz-Lernwert für alle, die ihn beim Lernen oder Arbeiten benötigen Kommen Sie und lernen Sie gemeinsam.
Vorwort
Dieser Artikel stellt Ihnen hauptsächlich die Prinzipien und Methoden der Python-Modulsuche vor und teilt sie als Referenz und zum Studium Ich werde weiter unten nichts sagen. Schauen wir uns die ausführliche Einführung an:
Grundlegende Konzepte
Modul
Modul, eine Py-Datei oder eine andere Datei, die importiert werden kann, ist ein Modul
Paket
Paket, eine Datei, die importiert werden kann ein __init__-Dateiordner
relativer Pfad
relativer Pfad, Pfad relativ zu einem Verzeichnis
absoluter Pfad
Absoluter Pfad, vollständiger Pfad
Pfadsuche
Der Python-Interpreter sucht nach importierten Paketen oder Modulen
So findet der Python-Interpreter Pakete und Module
Python führt eine Py-Datei aus. Unabhängig davon, ob die Ausführungsmethode ein absoluter Pfad oder ein relativer Pfad ist, fügt der Interpreter das Verzeichnis hinzu, in dem sich die Datei befindet Datei befindet sichsys.path
In dieser Liste sucht Python nach Paketen und Modulen in sys.path
, und der Inhalt in sys.path
selbst wird durch die Umgebungsvariablen von Python bestimmt.
code-1
#test.py import os import sys print sys.path[0] # execute python test.py python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test.py
Die Ausführung zeigt, dass sowohl relative als auch absolute Pfade die gleichen Ergebnisse ausgeben. Testen Sie unabhängig von der Ausführungsart. py Der Ordner, in dem es sich befindet, wird oben in sys.path
hinzugefügt, was der Position mit Index 0 entspricht.
In welcher Reihenfolge sucht der Python-Interpreter nach Paketen
Der Interpreter sucht zuerst nach integrierten Modulen, dann sucht sys.path
, eine solche Suchsequenz führt dazu, dass das Paket oder Modul mit demselben Namen verdeckt wird.
Code-2
#ls ├── os.py ├── test2.py ├── redis.py #test2.py import os from redis import Redis #execute test2.py Traceback (most recent call last): File "/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test2.py", line 1, in <module> from redis import Redis ImportError: cannot import name Redis
Da OS ein integriertes Modul ist, auch wenn sich im selben Verzeichnis ein Modul mit demselben Namen befindet , der Interpreter kann immer noch das richtige Betriebssystemmodul finden, es kann bestätigt werden, dass das integrierte Modul nicht blockiert wird und Redis ein Modul eines Drittanbieters ist. Der Standardinstallationsort ist site-packages in der Python-Umgebungsvariablen Der Interpreter wird gestartet, der Inhalt dieses Verzeichnisses wird hinzugefügt sys.path
, da das aktuelle Verzeichnis an der ersten Stelle von sys.path
steht, wird zuerst das Redis des aktuellen Verzeichnisses und das Redis-Modul in Site-Paketen gefunden ist verdeckt.
Interaktive Suchsequenz für die Ausführungsumgebung
Betreten Sie die interaktive Ausführungsumgebung, der Interpreter fügt automatisch das aktuelle Verzeichnis hinzu sys.path
, dann erscheint das aktuelle Verzeichnis in sys.path
in Form eines relativen Pfades:
>>> import os.path >>> import sys >>> os.path.abspath(sys.path[0]) '/Users/x/workspace/blog-code' >>>
Ansonsten ist alles andere wie das Ausführen einer Datei.
Die Variable __file__ im Modul
__file__ ist der Pfadname der Datei, aus der das Modul geladen wurde, sofern dies der Fall war Wenn ein Modul aus einer Datei geladen wird, ist __file__ der Pfadname des Moduls –Python Doc:
Wie der Name schon sagt, bezieht sich __file__, wenn das Modul als Datei angezeigt wird zur Moduldatei Der Pfadname, __file__, ausgeführt als relativer Pfad, ist ein relativer Pfad, und __file__, ausgeführt als absoluter Pfad, ist ein absoluter Pfad.
#test3.py print __file__ #相对路径执行 python test3.py test3.py #绝对路径执行 python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
Um sicherzustellen, dass __file__ jedes Mal genau den richtigen Speicherort des Moduls ermitteln kann, ist es am besten, erneut den absoluten Pfad os.path.abspath(__file__)
dorthin zu verwenden .
__file__ in der interaktiven Shell
>>> __file__ Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name '__file__' is not defined
Dies liegt daran, dass die aktuelle Ausführung der interaktiven Shell nicht in Form einer Datei geladen wird Dies ist nicht der Fall. Es gibt ein Attribut wie __file__.
sys.argv[0]-Variable
sys.argv[0]
wird verwendet, um die ausführbare Haupteintragsdatei abzurufen.
#test.py import sys print __file__ print sys.argv[0]
Der obige Ausdruck gibt das gleiche Ergebnis aus, da die ausführbare Hauptdatei und das Modul, zu dem __file__ gehört, identisch sind Unterschied erscheint.
#test.py import sys print __file__ print sys.argv[0] #test2.py import test #execute test2.py /Users/x/workspace/blog-code/p2016_05_28_python_path_find/child/test.py #__file__ test2.py #sys.argv[0]
Im Allgemeinen ist sys.argv[0]
der Pfad zum Abrufen der Eintragsausführungsdatei und __file__ der Pfad zum Abrufen einer beliebigen Moduldatei.
Die Rolle von sys.modules
Da Python in sys.path
nach Modulen sucht, werden die geladenen Module gespeichert. Wo? Die Antwort lautet sys.modules
. Sobald das Modul geladen ist, fügt Python das Modul zum nächsten Laden zu sys.modules
hinzu. Dies kann die Einführung des Moduls beschleunigen und als Cache fungieren.
>>> import sys >>> sys.modules['tornado'] Traceback (most recent call last): File "<input>", line 1, in <module> KeyError: 'tornado' >>> import tornado >>> sys.modules['tornado'] <module 'tornado' from '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'>
Wie bereits erwähnt, lädt der Python-Interpreter nach dem Start das integrierte Modul vor, was durch sys.modules
überprüft werden kann.
>>> sys.modules['os'] <module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'> >>>
借助 sys.modules
和 __file__,可以动态获取所有已加载模块目录和路径。
>>> import os >>> os.path.realpath(sys.modules['os'].__file__) '/Users/x/python_dev/lib/python2.7/os.pyc' >>> import tornado >>> os.path.realpath(sys.modules['tornado'].__file__) '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'
def get_module_dir(name): path = getattr(sys.modules[name], '__file__', None) if not path raise AttributeError('module %s has not attribute __file__'%name) return os.path.dirname(os.path.abspath(path))
summary
总的来说,Python 是通过查找 sys.path
来决定包的导入,并且系统包优先级>同目录>sys.path
,Python 中的特有属性 __file__ 以及 sys.argv[0]
,sys.modules
都能帮助我们理解包的查找和导入概念,只要能正确理解 sys.path
的作用和行为,理解包的查找就不是难题了。
总结
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung der Modulsuche in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!