这是程序的结构:
├── app.py
├── apps
│ ├── __init__.py
│ ├── secure
│ │ ├── handler.py
│ │ └── __init__.py
└ └── test.py
我正在app.py
中尝试从app.secure内部动态导入处理程序,如下所示:
import importlib
a = importlib.import_module('handler', 'apps.secure')
这样做,我希望导入处理程序,但是出现以下错误:
Traceback (most recent call last):
File "/home/user/Projects/toolkit/app.py", line 5, in <module>
a = importlib.import_module('handler', 'apps.sticker_to_sticker')
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'handler'
在尝试使用__import__
而不是__import__('apps.secure.handler')
之后,我注意到它实际上是导入了apps软件包。虽然from apps.secure import handler
可以正常工作。我需要动态导入,因为程序需要能够加载应用程序包内的任何包。
是否可以动态导入该模块,或者我必须使用exec
?
答案 0 :(得分:1)
尝试使“处理程序”导入相对:
import importlib
a = importlib.import_module('.handler', 'apps.secure')
documentation涵盖了从子模块内部进行相对导入的类似示例。