Как заменить использование устаревшего `imp.load_dynamic`? - PullRequest
0 голосов
/ 11 февраля 2020

Модуль imp устарел (начиная с версии 3.4), однако некоторые части инфраструктуры все еще используют imp.load_dynamic. Как это лучше всего заменить?

Внутренне, imp.load_dynamic использует importlib -машины :

from importlib._bootstrap import _load,
def load_dynamic(name, path, file=None):
    """**DEPRECATED**
    Load an extension module.
    """
    import importlib.machinery
    loader = importlib.machinery.ExtensionFileLoader(name, path)

    # Issue #24748: Skip the sys.modules check in _load_module_shim;
    # always load new extension
    spec = importlib.machinery.ModuleSpec(
        name=name, loader=loader, origin=path)
    return _load(spec)

Но глупо дублировать этот код (который хотя бы один раз нужно было улучшить). Какие есть лучшие альтернативы?


В документации importlib предлагается

import importlib.util
import sys

# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)

, которая не более привлекательна, чем код из CPython - источник.

1 Ответ

0 голосов
/ 11 февраля 2020

Как насчет importlib.import_module?

Он также отмечает:

Если вы динамически импортируете модуль, созданный с момента начала выполнения интерпретатора (например, создал исходный файл Python), вам может потребоваться вызовите invalidate_caches (), чтобы новый модуль был замечен системой импорта.

https://docs.python.org/3/library/importlib.html#importlib .import_module

...