如何使用 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'>