我用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
,显然要运行测试。
答案 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
}
}
,以便正确导入实用程序。由于该文件丢失,因此看不到该文件夹是软件包的一部分。错误消息告诉您没有软件包,这应该为您解决。