我尝试动态导入(使用" __ 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;的变量。一旦我加载它就从模块开始。
答案 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.module
,package2
也会导入并存储在包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'>