在setup.py中设置有条件的setup_requires依赖项

3

有没有办法告诉pip在不需要时跳过一些setup_requires依赖项?

在我的场景中,我在setup.py中声明pytest-runner为设置依赖项(用于执行测试)。当我尝试安装我的软件包(即:pip install my-package.tar.gz)时,它会下载pytest-runner,或者如果不可用,则安装失败(*)。

在setup.py中,我有:

...
setup_requires=['pytest-runner', 'flake8']
...

我希望告诉setup.py仅在执行测试时使用pytest-runner。这种做法可行吗?
正如@deceze所建议的那样,下面这个声明可以起作用:
setup_requires=['pytest-runner', 'flake8'] if 'test' in sys.argv else []

但我不想在setup.py中添加逻辑。

(*) 环境非常受限,因此下载依赖项是障碍。

2个回答

3

声明为一个额外内容是有意义的:

setup(
    ...,
    extras_require=dict(
        tests=[
            'pytest-runner'
        ]
    )
)

你可以使用 pip install my-package[tests] 来特定安装它。

另一种选择是:如果你能够在某种程度上检测到你的环境,setup.py 是一个完全功能的 Python 程序...你可以动态地决定是否将某些依赖项添加到需要列表中。


2
将它们声明为“extra”不起作用,因为在执行python setup.py test时它们不可用,而我不想在本地安装它们。检查环境肯定是一个选择,但希望不是唯一的选择。 - Gonzalo Matheu
pip install my-package[tests] 真的很酷!感谢你的建议。 - Charlie

1

rwt(Run With This)似乎是做这件事的首选方式。

它提供按需依赖解析,使包在解释器会话期间可用。其中一个目标场景是:测试运行器

安装rwt(*)后,您可以执行pytest-runner模块中的setup.py命令来加载它:

rwt pytest-runner -- setup.py test

或者

python -m rwt pytest-runner -- setup.py test

(*) 您仍然需要安装一个非必需的依赖项(即rwt),但它似乎对安装其他依赖项影响较小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接