3

我正在使用 tox 准备 venv 并运行单元测试,我的应用程序需要 openopt 库,该库又导入numpy.distutils.core到 setup.py 中。

无论我如何在我的 requirements.txt 中订购 numpy 和 openopt,我都无法确保在 openopt 的 setup.py 执行之前安装了 numpy 并退出ImportError: No module named numpy.distutils.core

我该如何解决?对于开发,我可以将 numpy 添加到 requirements.txt,运行 tox,添加 openopt 并再次运行 tox,但它不是生产就绪设置。

4

3 回答 3

3

更新tox 项目中有一个问题可能会被实现,它会添加功能以更“官方”的方式处理这些类型的问题。讨论在这里:添加一个选项以在创建 virtualenv 之后但在其他步骤之前运行命令

更新(更多背景知识):主要问题是假设其他一些软件包已经安装在setup.py. 这类问题属于bootstrap的范畴,如果要正确处理它们可能会很糟糕,但通常需要付出一些额外的努力才能做到这一点。如果您在设置时确实需要不同的包,您可以查看setup_requires一些额外的魔法(例如查看setuptools_scm以获得灵感)。在最坏的情况下,如果包不是很复杂,您可以将其作为包的一部分(尽管它有其自身的问题,例如保持最新和可能的许可冲突)。

原始答案

如果您requirements.txt已经使用,一个简单(但公认丑陋)的解决方案将是:

  1. 创建两个(或更多)需求文件(例如requirements-0.txtrequirements-1.txt(希望有更好的名称))。
  2. 按依赖项将包排序到这些文件中
  3. 使用命令而不是deps以正确的顺序安装它们

。例如

[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
于 2016-04-12T15:10:32.080 回答
0

它记录在https://testrun.org/tox/latest/example/basic.html#depending-on-requirements-txt

deps = -rrequirements.txt

根据 github 上的惯例,常见的技巧是:

deps =
    setuptools
    -r{toxinidir}/requirements.txt
于 2016-10-06T07:43:42.723 回答
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有点棘手。

于 2017-10-12T09:22:41.093 回答