importlib
вспомогательная функция
Вот удобный, готовый к использованию помощник для замены imp
на пример, основанный на том, что было упомянуто по адресу: https://stackoverflow.com/a/43602645/895245
main.py
#!/usr/bin/env python3
import os
import importlib
def import_path(path):
module_name = os.path.basename(path).replace('-', '_')
spec = importlib.util.spec_from_loader(
module_name,
importlib.machinery.SourceFileLoader(module_name, path)
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[module_name] = module
return module
notmain = import_path('not-main')
print(notmain)
print(notmain.x)
не магистральный
x = 1
Пробег:
python3 main.py
Выход:
<module 'not_main' from 'not-main'>
1
Я заменяю -
на _
, потому что мои импортируемые исполняемые файлы Python без расширения имеют дефисы. Это не обязательно, но дает лучшие имена модулей.
Этот шаблон также упоминается в документах по адресу: https://docs.python.org/3.7/library/importlib.html#importing-a-source-file-directly
Я перешел к нему, потому что после обновления до Python 3.7 import imp
печатает:
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
и я не знаю, как это отключить.
Протестировано в Python 3.7.3.