requirements.txt中的安装时依赖项

时间:2016-04-12 13:14:59

标签: python numpy pip tox

我正在使用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,但它不是生产就绪的设置。

3 个答案:

答案 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,那么一个简单(但不可否认的丑陋)解决方案就是:

  1. 创建两个(或更多)需求文件(例如requirements-0.txtrequirements-1.txt(希望名称更好))。
  2. 按依赖项将软件包排序到这些文件中
  3. 使用commands代替deps以正确的顺序安装
  4. .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有点棘手。