2

假设我有两个几乎相同版本的python 包mymod,即mymod0 和mymod1。这些包中的每一个都有文件init .py 和 foo.py,而 foo.py 有一个函数 printme()。调用 mymod0.foo.printme() 将打印“I am mymod0”,调用 mymod1.foo.printme() 将打印“I am mymod1”。到现在为止还挺好。

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

我试过这个:

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

但我得到这个错误: AttributeError: 'module' object has no attribute 'foo'

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

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

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

然后:

foo.printme()

这似乎有效。

4

1 回答 1

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功能函数。请注意:有几个与此相关的警告,它可能最终不会按照您的意图进行。

我怎样才能动态地重新创建它?

for i in range(0,2):
   module_name = 'mymod%s' % i
   module=importlib.import_module(module_name)
   module.foo.printme()
于 2015-10-14T16:50:22.457 回答