我有使用 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
.
这不是与 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
选项。