动态加载python中的包

问题描述:

假设我有两个几乎相同的python包mymod,即mymod0和mymod1。每个包都有文件init .py和foo.py,并且foo.py有一个printme()函数。调用mymod0.foo.printme()将打印“我是mymod0”,调用mymod1.foo.printme()将打印“我是mymod1”。到现在为止还挺好。动态加载python中的包

但现在我需要动态地导入mymod0或mymod1。用户将输入0或1到脚本(如变量 “索引”),然后我可以创建的packageName = “mymod” + STR(指数)

我尝试这样做:

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

但我得到这个错误: AttributeError:'模块'对象没有属性'富'

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

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

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

然后:

foo.printme() 

这似乎是工作。

How can I specify the the package should now be referred to as module so that module.foo.printme() will work?

你必须确保<module_name>.__init__进口foo到模块的名称空间:

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

那么你可以

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

But now I need to dynamically import either mymod0 or mymod1.

注意这仅适用第一次因为蟒蛇缓存加载模块。如果程序启动后模块发生了变化,请使用reload function功能。请注意:与此相关的几个警告,它可能最终不会做你想要的。

How can I recreate this dynamically?

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

确定这是接近的,但我想要做的是动态重新创建此导入:mymod0为mymod。所以这里mymob现在指的是包mymod0。如果我静态地做,那么我可以调用mymod0.foo.printme(),没有问题。我如何动态地重新创建它? – Marc

+0

@Marc请看我的编辑。注意我没有测试这个 – miraculixx