Я придумал слегка измененную версию замечательного ответа @ SebastianRittau (для Python> 3.4, я думаю), который позволит вам загружать файл с любым расширением в качестве модуля, используя spec_from_loader
вместо spec_from_file_location
:
from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader
spec = spec_from_loader("module.name", SourceFileLoader("module.name", "/path/to/file.py"))
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
Преимущество кодирования пути в явном SourceFileLoader
состоит в том, что механизм не будет пытаться выяснить тип файла из расширения. Это означает, что вы можете загружать что-то вроде файла .txt
с помощью этого метода, но вы не могли бы сделать это с помощью spec_from_file_location
без указания загрузчика, потому что .txt
не находится в importlib.machinery.SOURCE_SUFFIXES
.