Maison > Article > développement back-end > Explication détaillée des bases de Python sur les packages et les modules
Sauf indication contraire, ce qui suit est basé sur Python3
Résumé
Afin de réutiliser et de mieux maintenir le code, Python
utilise des modules et des packages ; un Python
fichier est un module, et un package est un répertoire spécial qui organise les modules (y compris __init__.py
fichier).
Chemin de recherche du module, Python
L'interpréteur recherche les modules dans un répertoire spécifique, et lors de l'exécution, sys.path
est le chemin de recherche.
Utilisez le mot-clé import
pour importer le module, faites attention à la relation entre import *
et __all__
.
Un module est un fichier contenant des définitions et des instructions Python
Python
Un module est Un fichier contenant des définitions et des instructions. Le nom du fichier est le nom du module plus le suffixe .py
.
Supposons qu'il existe une fonction ou une classe qui remplit une fonction spécifique et qui est facile à utiliser. Pour utiliser cette fonctionnalité, vous devez copier ce code dans chaque fichier que vous devez utiliser. Le code en double est un tabou en programmation. Si l'implémentation de la fonction doit être modifiée, chaque occurrence devra être modifiée. C'est anti-humain.
La réutilisation peut très bien résoudre ce problème. En fait, les structures telles que les fonctions et les classes facilitent également la réutilisation dans une certaine mesure.
Python
organise une série de fonctions, classes, etc. liées dans un fichier, et chaque fichier est un module Python
.
Utilisez le mot-clé import
pour importer le module (le module doit être dans le chemin de recherche) :
importer sys ; instruction d’importation de base.
importer sys en tant que système ; alias le nom importé.
à partir du chemin d'importation système ; Importer des éléments spécifiques au module.
from sys import *; importer tous les noms importables depuis sys
import-only-once
module Le comportement importer une seule fois constitue une optimisation substantielle dans la plupart des cas. Dans le même cycle de vie de l'interpréteur, si vous utilisez l'instruction import
plusieurs fois pour importer le même module, l'importation n'aura lieu qu'une seule fois.
Cela peut être prouvé en ajoutant des instructions de sortie au module. Utiliser
import *
et __all__
utiliser import *
peut polluer l'espace de noms du module actuel et importer certains noms qui n'ont pas besoin d'être cités. Son utilisation n’est donc pas recommandée.
En fait, un module tiers standardisé fournira une interface publique de module, exposant les interfaces disponibles pour le module. Les interfaces publiques sont définies par une liste de noms de modules __all__
.
Par exemple, si vous définissez un module nommé mtest1
:
__all__ = ['test1', 'test12']def test1():print('test1')def test11():print('test11')def test12():print('test12')
Utilisez toutes les méthodes d'importation :
>>> form mtest1 import *>>> dir()>>> ['__annotations__', '__builtins__', '__doc__', '__loader__','__name__', '__package__', '__spec__', 'test1', 'test12']
Vous pouvez voir que la fonction test11()
n'a pas été importée. C'est le rôle de __all__
.
Afin de mieux organiser les modules, les modules sont regroupés en packages.
Du point de vue du système de fichiers, le package est le répertoire où se trouve le module. Pour que l'interpréteur Python
le traite comme un package, le package doit contenir directement un fichier (module) nommé __init__.py
.
Un package est fondamentalement un autre type de module, sauf qu'il peut contenir d'autres modules et packages. En tant que module, le contenu d'un package est en fait le contenu du fichier __init__.py
(module).
Par exemple, pour un colis nommé constants
, le fichier constants/__init__.py
est le suivant :
PI = 3.14
Ensuite le colis constants
peut être traité comme module ordinaire :
import constantsprint(constants.PI)
Si vous souhaitez construire un package nommé drawing
, qui contient le shapes
et colors
modules, vous devez créer le répertoire et le fichier :
文件/目录 | 描述 |
---|---|
~/python | 加入到搜索路径中的目录 |
~/python/drawing | 包目录(drawing包) |
~/python/drawing/__init__.py | 包代码(drawing模块) |
~/python/drawing/colors.py | color模块 |
~/python/drawing/shapes.py | shapes模块 |
假设已经将~/python
作为搜索目录。依照这个设置,下列导入语句都是合法的:
import drawing
# 导入drawing包(即__init__.py
模块)
import drawing.colors
# 导入colors模块,使用drawing.colors.attr的方式引用
from drawing import shapes
# 导入shapes模块
__all__
变量
与模块的__all__
变量相似,包的__all__
变量决定了使用from package import *
导入的子模块。
如以上drawing
包的__init__.py
文件内容如下:
__all__ = ['colors']
那么使用from drawing import *
只会导入colors
模块。
现在已经编写完了一个很好用的模块,并且通过了测试。那么如何让这个模块可用呢?即如何让这个模块具备可导入到其他模块的能力。
当使用import
语句导入模块时,Python
解释器通过以下方式搜索模块:
首先搜索built-in
模块
最后搜索变量sys.path
提供的路径列表
sys.path
在解释器启动时从以下位置初始化:
当前脚本路径
环境变量PYTHONPATH
指定的路径集合
安装默认路径
sys.path
初始化完成后,可以在运行时修改。
那么现在若要使模块可用,一是将其放置到已有的搜索路径下,二是指定模块所在路径为搜索路径。
一般情况下,若选择第一种方式,我们将模块放置到Python
安装路径的\lib\site-packages
下,这个目录是专门用来安装第三方模块的。正如该目录下的README
文件展示的那样:
This directory exists so that 3rd party packages can be installed here. Read the source for site.py for more details.
若选择第二种方式,直接将模块所在目录加入到环境变量PYTHONPATH
中即可。
值得注意的是,可以在\lib\site-packages
路径下新建一个名为user_lib.pth
的文件,内容是需要搜索的路径,一行一个,也可以将指定路径加入到搜索目录中:
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!