如何使用web2py导入子模块?

时间:2016-10-06 20:41:31

标签: python web2py

我尝试动态导入(使用" __ import __()")web2py中的子模块并且它似乎没有找到子模块。

这是一个示例路径: web2py / app / modules / module.py< - 这有效 web2py / app / modules / module_folder / submodule.py< - 这不会被发现。

现在作为解决方法我使用' exec()'但我宁愿不这样做。

问题解答:

"你在module_folder中有__init__.py吗?"

是的。

"您编写的用于导入web2py / app / modules / module_folder / submodule.py的代码行究竟是什么?"

mapping_module = __import__('communication_templates.mappings.%s' % module_name)

"错误是什么?"

<type 'exceptions.AttributeError'> 'module' object has no attribute 'mapping_dict'

说明:我试图获取名为&#39; mapping_dict&#39;的变量。一旦我加载它就从模块开始。

1 个答案:

答案 0 :(得分:0)

这里的问题是__import__没有做到最直观的事情(import btw也没有。)

以下是发生的事情:

>>> import sys
>>> x = __import__('package1.package2.module')
>>> x
<module 'package1' from 'C:\\Temp\\package1\\__init__.py'>

即使导入package1.package2.module,返回的变量实际上是package1

因此,要访问package1.package2.module中的内容,必须再次挖掘:

>>> x.package2.module.Class
<class 'package1.package2.module.Class'>

是否与仅导入package1相同?

不是真的:

>>> x = __import__('package1')
>>> x
<module 'package1' from 'C:\\Temp\\package1\\__init__.py'>
>>> x.package2.module.Class
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'package1' has no attribute 'package2'

为什么?

嗯,__import__与`import相同,也就是说,它们是相同的:

package1 = __import__('package1.package2.module')
# is the same as:
import package1.package2.module

package1 = __import__('package1')
# is the same as:
import package1

在每种情况下,您只获得一个局部变量package1

如果导入package1.package2.modulepackage2也会导入并存储在包package2等的package1属性中。

解决方案

要访问package1.package2.module.Class,如果package1.package2.module在字符串中:

>>> s = 'package1.package2.module'
>>> module = __import__(s)
>>> for submodule_name in s.split('.')[1:]:
...     module = getattr(module, submodule_name)
...
>>> module.Class
<class 'package1.package2.module.Class'>