防止从源头输入毒素

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

我有使用 setuptools

test
命令的旧 Python 包,我想迁移到 tox。 这些包使用 flat layout。我曾经在使用自定义脚本的隔离环境中安装后运行测试。

当我使用 tox 运行测试时,导入是从源目录而不是 tox 隔离的虚拟环境完成的。 我尝试了

toxworkdir
changedir
选项,但我仍然在
sys.path
中有源目录。

这特别有问题,因为我已经编译了模块。

我该怎么办?

项目布局如下:

.
├── mymodule -> python code for mymodule
├── setup.py
├── src -> C++ code for extension
├── tests -> unittests
└── tox.ini

setup.py

_api = Extension(
    "mymodule._api",
    sources=("src/src1.cpp", ...)
)
setup(
    packages=["mymodule"],
    ext_modules=[_api],
    # ...
)

tox.ini

[tox]
env_list = py{27,35,36,37,38,39,310,311,312}
minversion = 3.28

[testenv]
description = run the tests with pytest
package = wheel
wheel_build_env = .pkg
deps = pytest
commands = pytest {tty:--color=yes} tests

tox 将我的包安装在:

.tox/py311/lib/python3.11/site-packages/mymodule/_api.cpython-311-x86_64-linux-gnu.so

但是当我使用

tox run
运行测试时,我有:

ModuleNotFoundError: No module named 'mymodule._api'

sys.path
它从项目目录而不是虚拟环境导入
mymodule

tox版本是

4.4.7
.

pytest setuptools setup.py python-packaging tox
1个回答
0
投票

这不是与 tox 相关的问题,而是与 pytest 导入机制有关的问题。

pytest 搜索包的顶级目录,只要

__init__.py
文件存在。然后它改变
sys.path
以添加该路径。默认情况下,路径添加在第一个位置,但您可以配置在最后添加。

根据文档,

--import-mode append
allows to run test modules against installed versions of a package”。

解决方案

[testenv]
changedir = tests
deps = pytest
commands = pytest {tty:--color=yes} --import-mode append

通过从

__init__.py
目录中删除
tests
文件,我们可以删除
--import-mode append
选项。

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