Python: динамический импорт кода модуля из строки с помощью importlib - PullRequest
2 голосов
/ 29 апреля 2019

Я хочу динамически импортировать модуль в Python (3.7), при этом код модуля определяется в строке.

Ниже приведен рабочий пример, использующий модуль imp, который не рекомендуется в пользуиз importlib (начиная с версии 3.4):

import imp

def import_code(code, name):
    # create blank module
    module = imp.new_module(name)
    # populate the module with code
    exec(code, module.__dict__)
    return module

code = """
def testFunc():
    print('spam!')
"""

m = import_code(code, 'test')
m.testFunc()

Документация Python гласит, что вместо imp.new_module() следует использовать importlib.util.module_from_spec().Однако, похоже, нет способа создать пустой объект модуля с использованием модуля importlib, как я мог бы с imp.

Как я могу использовать importlib вместо impдобиться того же результата?

1 Ответ

3 голосов
/ 29 апреля 2019

Вы можете просто создать экземпляр types.Module:

import types
mod = types.ModuleType("mod")

Затем вы можете заполнить его exec, как вы это делали:

exec(code, mod.__dict__)
mod.testFunc() # will print 'spam!'

Таким образом, ваш код будет выглядеть следующим образом:

import types

def import_code(code, name):
    # create blank module
    module = types.ModuleType(name)
    # populate the module with code
    exec(code, module.__dict__)
    return module

code = """
def testFunc():
    print('spam!')
"""

m = import_code(code, 'test')
m.testFunc()

Как прокомментировал @Error - Syntactical Remorse, вы должны помнить, что exec в основном выполняет любой код, содержащийся в строке, которую вы передаете, поэтому вы должны использовать его сДополнительная забота.По крайней мере, проверьте, что вы получили, но было бы хорошо использовать исключительно предопределенные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...