如何使用 web2py 导入子模块?
How do I import a submodule with web2py?
我正在尝试对 web2py 中的子模块进行动态导入(使用“__import__()”),但它似乎没有找到子模块。
这是一个示例路径:
web2py/app/modules/module.py <-- 这有效
web2py/app/modules/module_folder/submodule.py <-- 这不会被发现。
现在我正在使用 'exec()' 作为解决方法,但我不想那样做。
问题答案:
"Do you have __init__.py in module_folder?"
是的。
"What exactly is the line of code you write to import web2py/app/modules/module_folder/submodule.py?"
mapping_module = __import__('communication_templates.mappings.%s' % module_name)
"what is the error?"
<type 'exceptions.AttributeError'> 'module' object has no attribute 'mapping_dict'
说明:我试图在加载模块后从模块中获取名为 'mapping_dict' 的变量。
这里的问题是 __import__
没有做最直观的事情(顺便说一句,import
也没有)。
事情是这样的:
>>> 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
也被导入并存储在包package1
等的package2
属性中
解决方案
要访问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'>
我正在尝试对 web2py 中的子模块进行动态导入(使用“__import__()”),但它似乎没有找到子模块。
这是一个示例路径: web2py/app/modules/module.py <-- 这有效 web2py/app/modules/module_folder/submodule.py <-- 这不会被发现。
现在我正在使用 'exec()' 作为解决方法,但我不想那样做。
问题答案:
"Do you have __init__.py in module_folder?"
是的。
"What exactly is the line of code you write to import web2py/app/modules/module_folder/submodule.py?"
mapping_module = __import__('communication_templates.mappings.%s' % module_name)
"what is the error?"
<type 'exceptions.AttributeError'> 'module' object has no attribute 'mapping_dict'
说明:我试图在加载模块后从模块中获取名为 'mapping_dict' 的变量。
这里的问题是 __import__
没有做最直观的事情(顺便说一句,import
也没有)。
事情是这样的:
>>> 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
也被导入并存储在包package1
等的package2
属性中
解决方案
要访问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'>