我正在编写一个模块化应用程序,它将在运行时根据启动参数等动态导入模块。为了使事情井井有条,我有以下目录结构:
myapp/
├── __init__.py
├── main.py
├── utils.py
├──modules/
├── __init__.py
├── iptables/
│ ├── __init__.py
│ ├── iptables.py
│ ├── [other files/directories/configuration...]
│ └── tests
│ ├── iptables_tests.py
├── layer4/
│ ├── __init__.py
│ ├── layer4.py
│ ├── [other files/directories/configuration...]
│ └── tests
│ ├── layer4_tests.py
我正在尝试完成以下任务:
main.py
应该可以做一些类似的事情from modules.layer4 import Layer4Manager
,Layer4Manager
里面有一个类modules/layer4/layer4.py
。如果可能的话,我想在不包含实际代码的情况下执行此操作__init__.py
,因为同一目录中还会有其他脚本/文件,因此将它们组合在目录中是有意义的(这也是脚本不包含的原因t 只是在modules
目录中)。iptables.py
并且layer4.py
应该能够从utils.py
.使用 Python unittest 框架和 Nose 的测试应该能够正确运行,例如,
iptables_tests.py
应该能够运行from myapp.modules.iptables import IPTablesController
和from myapp.utils import UtilityFunction
.
我已经为此奋斗了几个小时,但我无法让上述所有三个项目同时工作。使用from layer4 import *
or__all__
里面的变量modules/layer4/__init__.py
会破坏测试,因为它们无法from myapp.utils import UtilityFunction
.
消隐modules/*/__init__.py
使我无法做到from myapp.modules.layer4 import Layer4Manager
。
我尝试了其他几种组合,我认为我只是让事情变得更糟。我的目标是 Python 2.6。我猜某种相对导入会使事情变得更容易,但我不确定它们如何与我在这里使用的两级目录结构一起工作。
提前致谢!