4 votes

Comment Python gère-t-il les sous-paquetages ?

Disons qu'Ansible a été installé au moyen de "pip install ansible". Juste après l'installation, la déclaration d'importation suivante réussit :

from ansible.module_utils.basic import AnsibleModule

Un package local nommé "ansible.module_utils.custom" est maintenant créé. La structure du répertoire :

 ansible/
   __init__.py
   module_utils/
     __init__.py
     custom/
       __init__.py
       utils.py

Dès qu'elle est mise en place, la déclaration d'importation susmentionnée échoue. L'affirmation "basic" n'est pas définie. Le paquetage local ne déclare en effet pas de sous-paquetage "basic". Seule la bibliothèque Ansible installée le fait. Il semble que Python ait limité sa recherche au seul paquetage local.

J'avais l'impression que Python prendrait en compte l'ensemble du système avant d'abandonner la recherche de code. Qu'il sortirait du paquetage local et atteindrait finalement la bibliothèque Ansible installée.

Cette hypothèse est-elle erronée ? Si oui, est-il possible de faire coexister le paquet local avec le paquet installé ?

1voto

Manali Kagathara Points 675

Comment fonctionne l'importation

import abc

La première chose que fera Python sera de rechercher le nom abc dans le fichier sys.modules. Il s'agit d'un cache de tous les modules qui ont été importés précédemment.

Si le nom n'est pas trouvé dans le cache des modules, Python procède à une recherche dans la liste des modules intégrés. Il s'agit de modules qui sont préinstallés avec Python et qui se trouvent dans la bibliothèque standard de Python. Si le nom n'est toujours pas trouvé dans les modules intégrés, Python le recherche dans une liste de répertoires définie par sys.path. Cette liste inclut généralement le répertoire courant, qui est recherché en premier.

Lorsque Python trouve le module, il le lie à un nom dans la portée locale. Cela signifie que abc est maintenant défini et peut être utilisé dans le fichier actuel sans provoquer d'erreur de nom (NameError).

Si le nom n'est jamais trouvé, vous obtiendrez une erreur ModuleNotFoundError. Pour en savoir plus sur les importations, consultez la documentation de Python aquí !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X