Python 如何在main.py中构造本地导入以允许测试?

Python 如何在main.py中构造本地导入以允许测试?,python,python-3.x,testing,module,package,Python,Python 3.x,Testing,Module,Package,我正在尝试测试我的应用程序。我有一个非常标准的项目,结构如下: root ├── app │ ├── __init__.py │ ├── main.py │ └── logic │ └── calc.py ├── tests │ └── test_main.py │ └── pyproject.toml My main.py使用了logic/calc.py文件中的一个类,如下所示: # app/main.py from logic.calc import Mode

我正在尝试测试我的应用程序。我有一个非常标准的项目,结构如下:

root
├── app
│   ├── __init__.py
│   ├── main.py
│   └── logic
│       └── calc.py
├── tests
│   └── test_main.py
│
└── pyproject.toml
My main.py使用了
logic/calc.py
文件中的一个类,如下所示:

# app/main.py

from logic.calc import Model

def main() -> None:
    m = Model()
    print(m.some_attribute)

if __name__ == "__main__":
    main()
我可以运行
python应用程序/main.py
,它会工作得很好。测试过程中出现问题:

# tests/test_main.py

from app.main import main

def test_main():
    assert main() is None
运行
pytest
将导致
ModuleNotFoundError:没有名为“logic”的模块
main.py
中的导入出错

因此,我们可以通过将app.logic.calc导入模型的导入调整为
来解决此问题。测试现在运行顺利。但是,现在我不能再运行
python main.py
!这将导致错误:
ModuleNotFoundError:没有名为“app”的模块。
。所以这似乎是第二十二条军规

安装软件包 使用
pyproject.toml
将项目作为软件包安装解决了这个问题,因为
app
模块现在随处可用。但是,我不希望安装包,因为我正在Docker中打包项目,包安装会产生一些我试图避免的影响

我可以让直接执行和测试同时工作,而不需要将项目作为一个包安装吗?


这似乎是一个基本问题,但不知何故,我一直无法找到答案或解决它。非常感谢您的帮助

解决方法是在单独的包中运行单元测试。这不仅修复了相关的依赖关系,还允许批量运行单元测试,而不是基于每个文件。感谢您的输入。在对名称空间如何工作进行了更多思考之后,我认为我的文章中描述的预期结果是不可能的。我最终还是安装了这个包,并以python-m app.main的身份运行了main。解决方法是在一个单独的包中运行单元测试。这不仅修复了相关的依赖关系,还允许批量运行单元测试,而不是基于每个文件。感谢您的输入。在对名称空间如何工作进行了更多思考之后,我认为我的文章中描述的预期结果是不可能的。我最终还是安装了这个包,并以python-m app.main运行了我的main。