我在 Linux 环境中工作并使用 venv。我来自 C++,并假设存在类似于 CMake 的东西来构建整个项目。基本上我的想法是将“库”与它们各自的测试很好地分开,并且当库被完全开发以在主程序中调用它们时。我是这样建造的:
mainFolder:
- .venv
- devel (containing the tests)
-- devel_modules1
-- devel_modules2
-- devel_modules3
- modules (containing the modules)
-- modules1
-- modules2
-- modules3
每一个
devel_modules1-3
包含几个python文件来测试modules1-3
中对应的文件;只要我使用venv,我就希望能够“从任何地方”使用导入语句。我的理解是,要做到这一点,我应该将模块视为一个包,使用 pip 安装它,它应该可以正常工作(???)。
在每个
modules1-3
中,我放置了一个文件__init__.py
包含
`__all__=[list of all the python files in this folder]`
在模块中,我放置了一个空的
__init__.py
文件和一个包含 :的文件
setup.py
from setuptools import setup, find_packages
import pathlib
here = pathlib.Path(__file__).parent.resolve()
setup(
name="modules",
version="0.0.1",
packages=find_packages(where="src")
)
启动时
pip3 install -e modules
它可以正常工作而不会引发任何错误,并且在已安装的软件包中正确列出;
但是当我尝试启动包含在
someTest.py
中的devel_modules
时,我得到了错误
ModuleNotFoundError: No module named 'modules'
从线
from modules.modules1.fileModules1 import DatabaseConnector
我做错了什么?
这是我推荐的项目结构:
.
├── .venv
│ └── ...
├── pyproject.toml
├── src
│ └── modules
│ ├── __init__.py
│ ├── modules1
│ │ ├── __init__.py
│ │ ├── some_module.py
│ │ └── ...
│ └── modules2
│ ├── __init__.py
│ └── another_module.py
└── test
├── test_modules.py
├── modules1
│ └── test_modules1.py
└── modules2
└── test_modules2.py
pyproject.toml
[build-system]
build-backend = 'setuptools.build_meta'
requires = [
'setuptools',
]
[project]
name = "modules"
version = "0.0.1"
这是一个“规范”的项目结构。应该不需要
setup.py
或setup.cfg
。 src
布局由 setuptools 自动识别,当与“可编辑”安装 (.venv/bin/python -m pip install --editable .
) 结合使用时,此布局可防止在开发阶段出现一些常见的导入问题。测试可以根据需要嵌套,像 pytest 这样的“test runner”应该能够毫无问题地处理这个问题。