Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Prinzipien und Methoden der Python-Modulsuche

Einführung in die Prinzipien und Methoden der Python-Modulsuche

巴扎黑
巴扎黑Original
2017-08-12 14:31:061451Durchsuche

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])
&#39;/Users/x/workspace/blog-code&#39;
>>>

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 &#39;__file__&#39; 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[&#39;tornado&#39;]
Traceback (most recent call last):
 File "<input>", line 1, in <module>
KeyError: &#39;tornado&#39;
>>> import tornado
>>> sys.modules[&#39;tornado&#39;]
<module &#39;tornado&#39; from &#39;/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc&#39;>

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[&#39;os&#39;]
<module &#39;os&#39; from &#39;/Users/x/python_dev/lib/python2.7/os.pyc&#39;>
>>>

借助 sys.modules 和 __file__,可以动态获取所有已加载模块目录和路径。


>>> import os
>>> os.path.realpath(sys.modules[&#39;os&#39;].__file__)
&#39;/Users/x/python_dev/lib/python2.7/os.pyc&#39;
>>> import tornado
>>> os.path.realpath(sys.modules[&#39;tornado&#39;].__file__)
&#39;/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc&#39;


def get_module_dir(name):
 path = getattr(sys.modules[name], &#39;__file__&#39;, None)
 if not path
 raise AttributeError(&#39;module %s has not attribute __file__&#39;%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 vonEinführung in die Prinzipien und Methoden der Python-Modulsuche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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