动态加载Python中的一个包

2024-09-28 17:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个几乎相同的python包mymod版本,即mymod0和mymod1。每个包都有文件init.py和食品,和食品有一个函数printme()。正在呼叫mymod0。印刷字体()将打印“我是mymod0”并调用mymod1。印刷字体()将打印“我是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语句,如下所示:

^{pr2}$

然后:

foo.printme()

这似乎有效。在


Tags: 文件函数import版本食品indexfooinit
1条回答
网友
1楼 · 发布于 2024-09-28 17:23:59

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

那你就可以了

^{pr2}$

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

注意,这只适用于第一次,因为python缓存加载的模块。如果模块在程序启动后发生了更改,请使用^{} 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()

相关问题 更多 >