动态加载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()
确定这是接近的,但我想要做的是动态重新创建此导入:mymod0为mymod。所以这里mymob现在指的是包mymod0。如果我静态地做,那么我可以调用mymod0.foo.printme(),没有问题。我如何动态地重新创建它? – Marc
@Marc请看我的编辑。注意我没有测试这个 – miraculixx