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]) '/Users/x/workspace/blog-code' >>>
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 '__file__' 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['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'>
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['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
的作用和行为,理解包的查找就不是难题了。
总结
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!