在python中动态加载包

时间:2015-10-14 16:42:04

标签: python python-import dynamic-import

假设我有两个几乎完全相同的python包mymod版本,即mymod0和mymod1。这些软件包中的每一个都有 init .py和foo.py文件,而foo.py只有一个函数printme()。调用mymod0.foo.printme()将打印“我是mymod0”并调用mymod1.foo.printme()将打印“我是mymod1”。到目前为止一切都很好。

但现在我需要动态导入mymod0或mymod1。用户将输入0或1到脚本(作为变量“index”),然后我可以创建packageName =“mymod”+ str(index)

我试过了:

module=importlib.import_module(module_name)
module.foo.printme()

但是我收到了这个错误: AttributeError:'module'对象没有属性'foo'

如何指定软件包现在应该被称为模块,以便module.foo.printme()可以工作?

更新:所以看起来最简单的解决方案是使用exec()函数。这样我就可以像这样动态创建一个import语句:

cmdname="from mymod%s import foo" % index
exec(cmdname)

然后:

foo.printme()

这似乎有效。

1 个答案:

答案 0 :(得分:0)

  

如何指定软件包现在应该被称为模块,以便module.foo.printme()可以工作?

您必须确保<module_name>.__init__foo导入模块的命名空间:

#./<module_name>/__init__.py
import foo

然后你可以

module=importlib.import_module(module_name)
module.foo.printme()
  

但现在我需要动态导入mymod0或mymod1。

注意这只能在第一次使用,因为python缓存了加载的模块。如果自程序启动以来模块已更改,请使用reload function功能。请注意:有几个与此相关的警告,它可能最终没有按照您的意图行事。

  

如何动态重新创建?

for i in range(0,2):
   module_name = 'mymod%s' % i
   module=importlib.import_module(module_name)
   module.foo.printme()