Как я могу импортировать функцию модуля python динамически?
Предполагая def my_function(): находится в my_apps.views Я бы хотел динамически импортировать "my_function", не используя что-то вроде exec или eval.
В любом случае, для этого. Я хочу сделать что-то похожее на:
my_function = import_func ( "my_apps.views.my_function" )
My_function() ... выполняется код
Ответы
Ответ 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")