Die vorherige Methode (imp.load_module), die ich im Web gefunden habe, war irgendwie veraltet, daher habe ich den dynamischen Ladevorgang von Modulen in Python 3.4 untersucht.
top
|- main.py
|- foo
|- __init__.py
|- some.py
|- sample.py
|- bar
|- __init__.py
|- some.py
imp.load_Finden Sie mithilfe des Moduls_module()Laden Sie mit dem Ergebnis von_module()Laden Sie das Modul mit.
Zu diesem Zeitpunkt wird der Modulname (Attribut `` `__name__```) auf das erste Argument` `` name``` von `` `load_module``` gesetzt.
In Python ist das Modul in `` `sys.modules``` registriert. Beachten Sie jedoch, dass das zuerst geladene Modul beim zweiten Gewinn überschrieben wird.
Daher ist das Laden von some.py für foo und bar mit demselben Namen möglicherweise nicht beabsichtigt.
```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
Als Ersatz fürimportlib
verwenden.
importlib.import_Laden Sie mit dem Modul das Modul mit dem relativen Pfad, wie er ist.
```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'
Ist es möglich, den Modulnamen frei zu setzen und den relativen Pfadnamen wie bei der alten Methode zu ignorieren?
Die offizielle Dokumentation führt einen Ersatz für "imp.load_module" ein:
sourcefileloader()
Kann verwendet werden, um den Modulnamen als erstes Argument festzulegen.
Der Modulname (einige in diesem Fall) ist immer noch der Gewinner. Sie können einen anderen Namen festlegen, stellen Sie ihn also nach Bedarf ein.
import importlib.machinery as imm
datum = imm.SourceFileLoader('some', 'foo/some.py').load_module()
Auswirkungen bei Verwendung von some.py mit foo / sample.py und beim dynamischen Laden. Beim dynamischen Lesen des Beispiels ist der durch den Import angegebene Modulname der in `` `sys.modules``` registrierte Name. Wenn Sie den obigen Modulnamen geändert haben, wirkt sich dies auch auf den Import hier aus.
import some # or
import foo.some
Recommended Posts