用python动态加载包

用python动态加载包,python,python-import,dynamic-import,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

假设我有两个几乎相同的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:“模块”对象没有属性“foo”

如何指定包现在应称为module的名称,以便module.foo.printme()可以工作

更新:看来最简单的解决方案是使用exec()函数。通过这种方式,我可以动态创建如下导入语句:

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

这似乎奏效了

如何指定包现在应称为module的名称,以便module.foo.printme()可以工作

您必须确保
foo
导入模块的命名空间中:

#./<module_name>/__init__.py
import foo
但现在我需要动态导入mymod0或mymod1

注意,这只在第一次使用时有效,因为python缓存加载的模块。如果自程序启动后模块发生了变化,则使用该功能。请注意:有几个警告与此相关,它可能最终没有达到您的预期

我如何动态地重新创建它


好的,这很接近,但我要做的是动态地重新创建这个导入:将mymod0作为mymod导入。所以这里mymob现在指的是包mymod0。如果我静态地这样做,那么我可以毫无问题地调用mymod0.foo.printme()。我如何动态地重新创建它?
#./<module_name>/__init__.py
import foo
module=importlib.import_module(module_name)
module.foo.printme()
for i in range(0,2):
   module_name = 'mymod%s' % i
   module=importlib.import_module(module_name)
   module.foo.printme()