1

这是程序的结构:

├── 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')我注意到它实际上导入了应用程序包之后。虽然from apps.secure import handler工作正常。我需要动态导入,因为程序需要能够在应用程序包中加载任何包。

有没有办法动态导入这个模块或者我必须使用exec

4

1 回答 1

2

尝试使“处理程序”导入相对:

import importlib
a = importlib.import_module('.handler', 'apps.secure')

文档涵盖了从子模块中进行相对导入的类似示例。

于 2018-07-10T15:49:42.090 回答