我有一个需要编译的 Python 项目。使用 tox
成功生成了 sdist
和 bdist_wheel
,但是当运行测试时,始终导入源代码模块,导致测试失败(因为那里没有二进制文件)。这是因为项目的根目录始终是 sys.path
上的第一个文件夹,我无法弄清楚为什么会出现这种情况。
project
├── foo
│ ├── __init__.py
│ └── bar.c <-- turns into bar.so in bdist_wheel
├── tests
│ ├── __init__.py
│ └── test_bar.py
├── tox.ini
└── setup.py
tox.ini
[tox]
envlist =
py37
[testenv]
changedir = {toxinidir}/tests
setenv =
PYTHONPATH = {envsitepackagesdir}
commands = {envpython} -m pytest --cov=bar --cov-report=html
请注意,我设置了
changedir
以确保项目根目录不是工作目录。我还将PYTHONPATH
设置为仅限于tox环境的site-packages。我还强制运行tox环境的Python。尽管如此,在测试运行期间,如果我打印出
sys.path
,我会看到:[
'/home/me/foo', # Bad, bad, bad
'/home/me/foo/tests', # Good, this is the CWD
'/home/me/foo/.tox/py37/lib/python3.7/site-packages', # Good
'/home/me/foo/.tox/py37/lib/python37.zip', # Umm, ok, this doesn't exist
'/home/me/foo/.tox/py37/lib/python3.7', # Good
'/home/me/foo/.tox/py37/lib/python3.7/lib-dynload', # Probably good
'/home/me/anaconda/envs/foo/lib/python3.7', # Bad, why is this here?
]
最大的问题出在
/home/me/foo
,这会导致源模块foo
被加载,而不是安装在tox
中的模块。另一个问题路径是
/home/me/anaconda/envs/foo/lib/python3.7
。如果在环境中找不到某些东西,我希望tox
不要回退到系统解释器。那么,tox是如何选择这些路径的?我该如何控制它以使其表现更好?