Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation de la recherche de module en Python

Explication détaillée de l'utilisation de la recherche de module en Python

黄舟
黄舟original
2017-08-11 14:06:531344parcourir

Cet article vous présente principalement les principes et les méthodes de recherche de modules en Python. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. Les amis qui en ont besoin peuvent suivre l'éditeur. ci-dessous. Venez apprendre ensemble.

Avant-propos

Cet article vous présente principalement les principes et méthodes de recherche de modules Python, et le partage pour votre référence et votre étude. Je ne dirai rien ci-dessous. Parlons davantage, jetons un œil à l'introduction détaillée :

Concepts de base

module

module, un fichier py ou autre fichier pouvant être importé est un module

package

package, un fichier contenant un dossier de fichiers __init__

chemin relatif

chemin relatif, chemin relatif à un répertoire

chemin absolu

Chemin absolu, chemin complet

Recherche de chemin

L'interpréteur python recherche les packages ou modules importés

Comment l'interpréteur Python trouve les packages et les modules

Python exécute un fichier py Que la méthode d'exécution soit un chemin absolu ou un chemin relatif, l'interpréteur ajoutera le répertoire où se trouve le fichier. le fichier se trouvesys.path Dans cette liste, Python recherche les packages et les modules dans sys.path , et le contenu dans sys.path lui-même est déterminé par les variables d'environnement de Python.

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

L'exécution montre que les chemins relatifs et absolus génèrent les mêmes résultats, et quel que soit le mode d'exécution, testez. py Le dossier où il se trouve sera ajouté en haut de sys.path, qui est la position d'index 0.

Quel est l'ordre dans lequel l'interpréteur Python recherche les packages

L'interpréteur recherche d'abord les modules intégrés ? puis recherche sys.path , une telle séquence de recherche entraînera l'obscurcissement du package ou du module portant le même nom.

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

Puisque os est un module intégré, même s'il existe un module du même nom dans le même répertoire , l'interpréteur peut toujours trouver le bon module OS, il peut être confirmé que le module intégré ne sera pas bloqué et que redis est un module tiers. L'emplacement d'installation par défaut est les packages de site dans la variable d'environnement Python After. l'interpréteur est démarré, le contenu de ce répertoire sera ajouté sys.path , puisque le répertoire courant sera à la première place de sys.path, le redis du répertoire courant se trouve en premier, et le module redis dans site-packages est obscurci.

Séquence de recherche de l'environnement d'exécution interactif

Entrez dans l'environnement d'exécution interactif, l'interpréteur ajoutera automatiquement le répertoire actuel sys.path, puis le répertoire courant apparaît dans sys.path sous la forme d'un chemin relatif :


>>> import os.path
>>> import sys
>>> os.path.abspath(sys.path[0])
&#39;/Users/x/workspace/blog-code&#39;
>>>

A part ça, tout le reste revient à exécuter un fichier .

La variable __file__ dans le module

__file__ est le chemin du fichier à partir duquel le module a été chargé, s'il l'était chargé à partir d'un fichier. Si un module est chargé à partir d'un fichier, __file__ est le nom du chemin du module –Python Doc :

Comme son nom l'indique, lorsque le module apparaît sous forme de fichier, __file__ fait référence. au fichier du module Le nom du chemin, __file__ exécuté comme chemin relatif est un chemin relatif, et __file__ exécuté comme chemin absolu est un chemin absolu.


#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

Afin de garantir que __file__ puisse obtenir avec précision l'emplacement correct du module à chaque fois, il est préférable de reprendre le chemin absolu os.path.abspath(__file__) pour y accéder .

__file__ dans le shell interactif


>>> __file__
Traceback (most recent call last):
 File "<input>", line 1, in <module>
NameError: name &#39;__file__&#39; is not defined

Cela est dû au fait que l'exécution actuelle du shell interactif n'est pas chargée sous la forme d'un fichier, donc ce n'est pas le cas. Il existe un attribut tel que __file__. La variable

sys.argv[0]

sys.argv[0] est utilisée pour obtenir le fichier exécutable de l'entrée principale.


#test.py
import sys
print __file__
print sys.argv[0]

L'impression ci-dessus donne le même résultat, car le fichier exécutable principal et le module auquel __file__ appartient sont les mêmes. Lorsque nous modifions le fichier d'entrée, le la différence apparaît.


#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]

En général, sys.argv[0] est le chemin pour obtenir le fichier d'exécution d'entrée, et __file__ est le chemin pour obtenir n'importe quel fichier de module.

Le rôle de sys.modules

Puisque Python recherche des modules dans sys.path , les modules chargés sont stockés Où ? La réponse est sys.modules. Une fois le module chargé, Python l'ajoutera à sys.modules pour le prochain chargement. Cela peut accélérer l'introduction du module et agir comme un cache.


>>> 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;>

Comme mentionné précédemment, une fois l'interpréteur Python démarré, il préchargera le module intégré, qui peut être vérifié par sys.modules .


>>> 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 的作用和行为,理解包的查找就不是难题了。

总结

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn