模块不认为自己是软件包的一部分

时间:2019-02-11 20:53:25

标签: python python-3.x python-import importerror python-packaging

我用cookiecutter创建了一个Python3项目,其结构如下(为便于阅读而简化):

── docs
│   ├── ...
....
├── my_application
│   ├── __init__.py
│   ├── my_application.py
│   └── util
|       └── utility.py
├── README.rst
├── requirements_dev.txt
├── setup.cfg
├── setup.py
├── tests
│   ├── test_my_application.py
│   └── test_utility.py
└── ...

my_application.py

#!/usr/bin/env python3

from my_application.util import utility

utility.hello_utility()

def hello_app():
    return "Main App"

test_my_application.py

#!/usr/bin/env python3
import pytest

from my_application import my_application

def test_main_app():
    assert my_application.hello_app() == 'Main App'

使用这些import语句,我的测试运行正常,但是运行该应用程序会出现以下错误:

from my_application.util import utility
ModuleNotFoundError: No module named 'my_application.util';
'my_application' is not a package

将导入的my_application.py更改为from util import utility可以解决这种情况:程序可以运行,但是测试无法再使用from my_application import my_application导入主模块。

奇怪的是,以下内容仍然有效:

test_utility.py

from my_application.util import utility
def test_utility():
    assert utility.hello_utility() == 'Found'

我知道,我可以通过应用一种常见的技巧来解决此问题,例如,附加到sys.path或修改PYTHONPATH变量,但是我希望了解为什么主模块不存在当其他模块起作用时,将自身识别为包的一部分。我知道一个事实,即它也取决于运行模块的方式和位置。就我而言,我只想直接运行主模块my_application.py,显然要运行测试。

1 个答案:

答案 0 :(得分:-1)

您需要在util文件夹中有一个public class BmiData { private String gender; private Double height; private Double weight; // Constructor, getters and setters public Double calculateBmi() { // perform the calculation here } } ,以便正确导入实用程序。由于该文件丢失,因此看不到该文件夹​​是软件包的一部分。错误消息告诉您没有软件包,这应该为您解决。