我正在使用tox准备venv并运行单元测试,我的应用程序需要openopt库,而后者又在其setup.py中导入numpy.distutils.core
。
无论我如何在我的requirements.txt中订购numpy和openopt,我都无法确保在执行openopt的setup.py之前安装了numpy并退出ImportError: No module named numpy.distutils.core
我该如何解决?对于开发,我可以将numpy添加到requirements.txt,运行tox,添加openopt并再次运行tox,但它不是生产就绪的设置。
答案 0 :(得分:3)
更新在tox项目中可能会出现一个问题,该问题会增加处理这些问题的功能,以及更多的官员"办法。讨论在这里:Add an option to run commands after virtualenv creation but before other steps
UPDATE(更多背景信息):主要问题是假设某个其他软件包已经安装在setup.py
中,这是一个BadThing(TM)。这些问题属于bootstrapping区域,它们处理起来可能很难处理,但通常可以通过一些额外的努力来实现。如果你真的在设置时需要一个不同的包,你可以查看setup_requires
和一些额外的魔法(看看例如setuptools_scm的灵感)。在最糟糕的情况下,如果软件包不复杂,你可以将它作为软件包的一部分(虽然它有自己的问题,比如保持最新和可能的许可冲突)。
原始回答:
如果您已经使用requirements.txt
,那么一个简单(但不可否认的丑陋)解决方案就是:
requirements-0.txt
和requirements-1.txt
(希望名称更好))。.e.g。
[testenv]
deps =
pytest
# whatever else where order does not matter
commands =
pip install -r {toxinidir}/requirements-0.txt
pip install -r {toxinidir}/requirements-1.txt
# ... and more if needed
# now do your actual testing ...
pytest tests/unit
...或者如果您想让它更简单,只需将正在导入的包裹放在另一个包裹的setup.py
正好在您的单个requirements.txt前面
[...]
commands =
pip install <package that needs to be installed first (e.g. numpy)>
pip install -r {toxinidir}/requirements.txt
pytest tests/unit
答案 1 :(得分:0)
它记录在https://testrun.org/tox/latest/example/basic.html#depending-on-requirements-txt
中deps = -rrequirements.txt
根据github上的常规做法,常见的伎俩是:
deps =
setuptools
-r{toxinidir}/requirements.txt
答案 2 :(得分:0)
我有一种在setup.py
中引导构建时依赖关系的通用方法。即使您没有使用tox
,也可以使用此功能。对于这种情况,请将以下代码段添加到setup.py
脚本的顶部。
from setuptools.dist import Distribution
# Bootstrapping dependencies required for the setup
Distribution(dict(setup_requires=['numpy']))
警告:这将使用numpy
安装easy_install
。使用此方法安装numpy
有点棘手。