将控制台脚本(例如flake8)安装到环境中作为test_requires的一部分

时间:2018-09-11 11:37:53

标签: python setuptools

我希望将Python软件包的依赖项分为setup_requirestests_require,以确保完全分离依赖项。

我运行的测试命令需要将一些控制台脚本安装到环境(flake8mypynosetests)。这些在test_requires中列为依赖项。

当我运行python setup.py test时,tests_require下的要求会以鸡蛋的形式下载,但是通常不会安装到您的虚拟环境中的控制台脚本不可用。

因此,测试命令失败,因为flake8等不可用。

有没有办法解决这个问题?

这与Specifying where to install 'tests_require' dependencies of a distribute/setuptools package非常相似,但不完全相同;因为我并不特别在意软件包的安装位置,所以可以使用软件包公开的控制台脚本。

到目前为止,我发现的唯一解决方法是用setup_requires的内容扩展tests_require,但这违反了将仅测试需求与安装软件包的需求分开的目的。 / p>

可以复制此示例的示例setup.py

import subprocess
import sys

from setuptools import setup
from setuptools.command.test import test as TestCommand

install_requires = ["flask", "gunicorn"]
tests_require = ["flake8", "mypy", "nose"]

# Uncommenting this fixes the problem, but is not optimal
# install_requires += tests_require


class FooTests(TestCommand):
    description = "run linters, and tests"

    def run_tests(self):
        self._run(["flake8", "tests", "my_package"])
        self._run(["mypy", "--ignore-missing-imports", "my_package"])
        self._run(["nosetests", "-vv"])

    def _run(self, command):
        subprocess.check_call(command)


setup(
    name="my_package",
    version="1.0",
    description="Example package",
    packages=["my_package"],
    install_requires=install_requires,
    tests_require=tests_require,
    cmdclass={"test": FooTests},
)

0 个答案:

没有答案