将 python venv 与自定义库一起使用

问题描述 投票:0回答:1

我在 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 

我做错了什么?

python python-import setuptools python-packaging
1个回答
2
投票

这是我推荐的项目结构:

.
├── .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”应该能够毫无问题地处理这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.