[PYTHON] Dynamisches Laden von Modulen

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.

Dateiorganisation

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

Alter Weg

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

Neuer Weg

impAls Ersatz fürimportlibverwenden.

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'

Wenn Sie den Modulnamen ändern möchten

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()

Auswirkung des Modulnamens

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

Zusammenfassung

Recommended Posts

Dynamisches Laden von Modulen
Liste der Python-Module
[Python] Laden von selbst erstellten mehrstufigen Modulen
Beschleunigen Sie das Laden von Python-Bildern
Memorandum zum Speichern und Laden des Modells
[Python] Beschleunigt das Laden von Zeitreihen-CSV
Zusammenfassung der Module und Klassen in Python-TensorFlow2-