中的Installtime依赖项要求.tx

2024-06-28 20:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用tox来准备venv和运行单元测试,我的应用程序需要openopt库,而openopt库又将numpy.distutils.core导入its中设置.py. 在

不管我怎么点numpy和openopt要求.txt我不能保证之前安装了numpy设置.py执行from openopt并用ImportError: No module named numpy.distutils.core退出

我该怎么解决呢?为了发展,我可以添加numpy到要求.txt,运行tox,添加openopt并再次运行tox,但这不是生产准备就绪的设置。在


Tags: nofrompycorenumpytxt应用程序tox
3条回答

更新tox项目中存在一个问题,该问题可能会增加功能,以更“官方”的方式处理此类问题。讨论在这里:Add an option to run commands after virtualenv creation but before other steps

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

原始答案

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

  1. 创建两个(或更多)需求文件(例如requirements-0.txt和{}(希望有更好的名称))。在
  2. 按依赖关系将包排序到这些文件中
  3. 使用commands而不是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中的包粘贴在您的单个文件的前面要求.txt在

^{pr2}$

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

deps = -rrequirements.txt

根据github上的常见做法,常见的窍门是:

^{pr2}$

我有一种通用的方法来引导setup.py中的构建时间依赖项。即使您不使用tox,也可以使用它。对于本例,请将以下代码段添加到setup.py脚本的顶部。在

from setuptools.dist import Distribution

# Bootstrapping dependencies required for the setup
Distribution(dict(setup_requires=['numpy']))

警告:这将使用easy_install安装{}。用这种方法安装numpy有点棘手。在

相关问题 更多 >