最佳实践:如何在setup.py中列出所需的依赖项?

2024-05-17 11:35:18 发布

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

我现在就是这样做的:

import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))

requires = [
    'pyramid',
    'pyramid_debugtoolbar',
    'waitress',
    'requests',
    'mock',
    'gunicorn',
    'mongoengine',
    ]

setup(name='repoapi',
      version='0.0',
      description='repoapi',
      packages=find_packages(),
      include_package_data=True,
      zip_safe=False,
      install_requires=requires,
      tests_require=requires,
      test_suite="repoapi",
      entry_points="""\
      [paste.app_factory]
      main = repoapi:main
      """,
      )

这样行吗?我有些麻烦。例如,对于pyramid,我不能使用系统范围的nosetests插件来运行测试。我需要在全局python站点包中安装pyramid

但我不想那样。所以我必须在这个项目中安装nose。但我不想成为依赖。我觉得它不应该属于requires。还没有。不过,我也不想一直手工安装。是的,我知道我有很多不想做的事。。。

但你怎么解决呢?我不想篡改全局python站点包,但我想安装nose作为virtualenv的一部分。

另外,pip安装需求文件。它稍微精确一些,因为我不需要手动指定版本,也不需要担心手动更新setup.py。扔pip freeze > file.txt就行了。

但是,pip可以返回垃圾,因为我们将垃圾包扔到virtualenv中。

这么多刀片。最好的做法是什么?你如何处理这些问题?

也许我错过了,但是https://github.com/django/django/blob/master/setup.py,Django是怎么做到的?


Tags: pippathimportpyramid站点osmainpackages
1条回答
网友
1楼 · 发布于 2024-05-17 11:35:18

您可以将需求分为“安装”依赖项和“测试”依赖项,如下所示:

import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))

install_requires = [
    'pyramid',
    'pyramid_debugtoolbar',
    'waitress',
    'requests',
    'gunicorn',
    'mongoengine',
    ]

tests_require = [
    'mock',
    'nose',
    ]

setup(name='repoapi',
      ...
      install_requires=install_requires,
      tests_require=tests_require,
      test_suite="nose.collector",
      ...
      )

这样,当有人安装包时,只安装“安装”依赖项。所以,如果有人只想使用这个包(而他们对运行测试不感兴趣),那么他们就不必安装测试依赖项。

如果确实要运行测试,可以使用以下命令:

$ python setup.py test

根据docs

Note that these required projects will not be installed on the system where the tests are run, but only downloaded to the project’s setup directory if they’re not already installed locally.

一旦“test”依赖项就位,它将运行“test_suite”命令。既然您提到nose是首选的测试运行程序,我就演示了如何配置它。

顺便说一下,Django setup.py并不是理解setuptools基础知识的最干净的例子。我认为Sentry setup.py是一个值得学习的更好的例子。

相关问题 更多 >