如何动态导入Python模块函数?
假设 my_function()
这个函数在 my_apps.views 这个地方,我想要动态地导入 my_function
,但是不想用像 exec
或 eval
这样的方式。
有没有什么办法可以做到这一点呢?我想做的事情类似于:
my_function = import_func("my_apps.views.my_function")
my_function()
... code is executed
7 个回答
在编程中,我们常常会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有时候我们在运行代码时,可能会看到一些错误信息,这些信息可能并不直观,让我们很难理解出错的原因。
为了帮助大家更好地理解这些问题,很多程序员会在网上分享他们的经验和解决方案。比如在StackOverflow这个网站上,大家可以提问,也可以回答别人的问题。这样一来,大家就可以互相学习,找到解决问题的方法。
总之,遇到问题时,不要气馁,可以通过查阅资料或者向他人请教来寻找答案。编程的路上,大家都是在不断学习和进步的。
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")
注意,Python 2.7
增加了一个叫 importlib
模块,这个模块是对 __import__()
的一些简化封装,同时也是 Python 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 中,并返回给你。
你想要
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 模块里的工具来实现这个,但会更复杂一些。