假设我有两个几乎完全相同的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()
这似乎有效。
答案 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()