[PYTHON] Chargement dynamique des modules

La méthode précédente (imp.load_module) que j'ai trouvée sur le Web était en quelque sorte obsolète, j'ai donc examiné le processus de chargement dynamique des modules dans Python 3.4.

organisation des fichiers

top
  |- main.py
  |- foo
          |- __init__.py
          |- some.py
          |- sample.py
  |- bar
          |- __init__.py
          |- some.py

Ancienne façon

imp.load_Rechercher à l'aide du module_module()Charger en utilisant le résultat de_module()Chargez le module avec.


 À ce stade, le nom du module (attribut `` `` __name__```) est défini sur le premier argument `` `` nom``` de `` load_module```.
 En Python, le module est enregistré dans `` `` sys.modules```, mais sachez que le module chargé en premier sera écrasé lors de la deuxième victoire.
 Par conséquent, le chargement de some.py pour foo et bar avec le même nom peut être involontaire.

```python
import sys
import imp

def load(dir_name:str, symbol:str): # -> module
    (file, path, description) = imp.find_module(dir_name + '/' + symbol)
    return imp.load_module(symbol, file, path, description)

m = load('foo', 'some')
m.__name__ # -> 'some'
sys.modules['some'] # -> 'module'

n = load('bar', 'some')
m == n # -> True

Nouvelle façon

impEn remplacement deimportlibutilisation.

importlib.import_Avec module, chargez le module avec le chemin relatif tel quel.



```python
import importlib

m = importlib.import_module('foo.some') # -> 'module'
m.__name__ # -> 'foo.some'

n = importlib.import_module('bar.some') # -> 'module'
n.__name__ # -> 'bar.some'

Lorsque vous souhaitez modifier le nom du module

Est-il possible de définir librement le nom du module, en ignorant le nom du chemin relatif, comme dans l'ancienne méthode? Les éléments suivants sont introduits dans la documentation officielle en remplacement de imp.load_module. sourcefileloader()Peut être utilisé pour définir le nom du module comme premier argument. Le nom du module (certains dans ce cas) est toujours le gagnant. Vous pouvez définir un nom différent, alors définissez-le selon vos besoins.

import importlib.machinery as imm
datum = imm.SourceFileLoader('some', 'foo/some.py').load_module()

Effet du nom du module

Impact lors de l'utilisation de some.py avec foo / sample.py et lors du chargement dynamique. Lors de la lecture dynamique de l'échantillon, le nom du module spécifié par l'importation sera le nom enregistré dans sys.modules```. Si vous avez changé le nom du module ci-dessus, cela affecte également l'importation ici.

import some   # or
import foo.some

Résumé

Recommended Posts

Chargement dynamique des modules
Liste des modules python
[Python] Chargement de modules personnalisés à plusieurs niveaux
Accélérer le chargement des images Python
Mémorandum de sauvegarde et modèle de chargement
[Python] Accélère le chargement du fichier CSV de séries chronologiques
Résumé des modules et des classes dans Python-TensorFlow2-