Подтвердить что ты не робот

Как я могу импортировать функцию модуля python динамически?

Предполагая def my_function(): находится в my_apps.views Я бы хотел динамически импортировать "my_function", не используя что-то вроде exec или eval.

В любом случае, для этого. Я хочу сделать что-то похожее на:

my_function = import_func ( "my_apps.views.my_function" )

My_function()  ... выполняется код

4b9b3361

Ответ 1

вы хотите

my_function = getattr(__import__('my_apps.views'), 'my_function')

Если вам известно имя функции во время компиляции, вы можете сократить ее до

my_function = __import__('my_apps.views').my_function

Это загрузит my_apps.views, а затем назначит его атрибут my_function локальному my_function.

Если вы уверены, что хотите только одну функцию, это приемлемо. Если вы хотите более одного атрибута, вы можете сделать:

views = __import__('my_apps.views')
my_function = getattr(views, 'my_function')
my_other_function = getattr(views, 'my_other_function')
my_attribute = getattr(views, 'my_attribute')

поскольку он более читабельен и сохраняет некоторые вызовы __import__. снова, если вы знаете имена, код можно сократить, как указано выше.

Вы также можете сделать это с помощью инструментов из imp, но это сложнее.

Ответ 2

Обратите внимание, что Python 2.7 добавлен модуль importlib, удобные обертки для __import__() и backport 3.1.

Этот модуль является второстепенным подмножеством того, что доступно в более полнофункциональном пакете с тем же именем из Python 3.1, который обеспечивает полную реализацию импорта. Что здесь сделано, чтобы облегчить переход с 2,7 до 3,1.

importlib.import_module(name, package=None)

Импортировать модуль. Аргумент name указывает, какой модуль следует импортировать в абсолютном или относительном выражении (например, pkg.mod или..mod). Если имя указано в относительных терминах, то аргумент пакета должен быть указан в пакете, который должен выступать в качестве якоря для разрешения имени пакета (например, import_module ('.. mod', 'pkg.subpkg') будет импортировать pkg.mod). Указанный модуль будет вставлен в sys.modules и возвращен.

Ответ 3

Я просто написал этот код и, похоже, много людей, поэтому, даже если позже я покажу его

def my_import(module_name,func_names = [],cache = False):
    if module_name in globals() and cache:
        return True
    try: 
        m = __import__(module_name, globals(), locals(), func_names, -1)
        if func_names:
            for func_name in func_names:
                globals()[func_name] = getattr(m,func_name)
        else:
            globals()[module_name] = m
        return True
    except ImportError:
        return False
def my_imports(modules):
    for module in modules:
        if type(module) is tuple:
            name = module[0]
            funcs = module[1]
        else:
            name = module
            funcs = []
        if not my_import(name, funcs):
             return module
    return ''

def checkPluginsImports(plugin,modules):
    c = my_imports(modules)
    if c:
        print plugin +" has errors!: module '"+c+"' not found"

# example: file test.py with "x" function
def d():
    checkPluginsImports('demoPlugin',[('test',['x'])])

d()
x()

Ответ 4

def import_by_string(full_name):
    module_name, unit_name = full_name.rsplit('.', 1)
    return getattr(__import__(module_name, fromlist=['']), unit_name)


exists = import_by_string("os.path.exists")