假设my_function()
位于my_apps.views中,我想动态导入my_function
,而不使用exec
或eval
之类的内容。
无论如何都要做到这一点。我想做类似的事情:
my_function = import_func("my_apps.views.my_function")
my_function()
... code is executed
答案 0 :(得分:24)
你想要
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模块中的工具执行此操作,但它更复杂。
答案 1 :(得分:9)
请注意,Python 2.7
添加了importlib
module,
__import__()
的便利包装和3.1功能的后端。
此模块是Python 3.1中功能更全面的包中提供的一小部分,它提供了完整的导入实现。这里提供了什么来帮助轻松地从2.7过渡到3.1。
importlib.import_module(name, package=None)
导入模块。 name参数指定以绝对或相对术语导入的模块(例如pkg.mod或..mod)。如果名称是以相对术语指定的,那么必须将package参数指定给作为解析包名称的锚点的包(例如import_module('.. mod','pkg.subpkg')将导入pkg的.mod)。指定的模块将插入到sys.modules中并返回。
答案 2 :(得分:1)
我刚刚写了这段代码,看起来很多人都需要,所以即使以后我也会展示它
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()
答案 3 :(得分:0)
.text-area > .scroll-pane{
-fx-hbar-policy:never;
-fx-vbar-policy:never;
}