Flask和nose的相对与绝对导入

时间:2017-03-30 20:19:30

标签: python-3.x flask nose

我有一个具有以下目录结构的Flask应用程序:

    ├── README.md
    ├── __init__.py
    ├── constants.py
    ├── businesspackage
    │   ├── README.md
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── detection
    │   ├── flagging_spec.txt
    │   └── tests
    ├── requirements.txt
    ├── run.py
    └── tests
        ├── __init__.py
        ├── __pycache__
        └── test_api.py

detection __init__.py中,我已导入必要的类,以便我可以从该顶级模块导入类,而不是需要提供完整路径模块内的每个.py文件。

我正在尝试从detection内部run.py导入一些类,但遇到以下错误:当我尝试使用{{1从顶级目录运行Flask应用程序时}}:

python3 run.py

在这里阅读了一些其他问题后,它建议我从相对导入更改为绝对导入。但是,如果我在 Traceback (most recent call last): File "run.py", line 9, in <module> from .businesspackage.detection import AdsDetection SystemError: Parent module '' not loaded, cannot perform relative import 中尝试以下导入:

run.py

然后我可以在没有导入错误的情况下运行我的Flask服务器,但是,我的导入会中断为测试运行器。我使用 from businesspackage.detection import AdsDetection 命令运行测试,使用鼻子1.3.7。如何定义我的导入,以便它们适用于Flask服务器和鼻子测试?

编辑:

nosetests如下:

businesspackage.__init__.py

1 个答案:

答案 0 :(得分:1)

因此,出于一些奇怪的原因,我在删除基级目录中的__init__.py文件后设法让绝对导入工作:即我的目录结构如下所示:

├── README.md
├── __init__.py
├── constants.py
├── businesspackage
│   ├── README.md
│   ├── __init__.py
│   ├── __pycache__
│   ├── detection
│   ├── flagging_spec.txt
│   └── tests
├── requirements.txt
├── run.py
└── tests
    ├── __init__.py
    ├── __pycache__
    └── test_api.py

我想在看到这里的一个答案之后我应该试一试:Python imports for tests using nose - what is best practice for imports of modules above current package。所以现在,我的所有包都使用绝对导入。