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.
top
|- main.py
|- foo
|- __init__.py
|- some.py
|- sample.py
|- bar
|- __init__.py
|- some.py
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
imp
En remplacement deimportlib
utilisation.
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'
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()
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
Recommended Posts