Python打包:指定外部需求的不同方法-差异、优势和建议

Python打包:指定外部需求的不同方法-差异、优势和建议,python,deployment,cython,setup.py,python-packaging,Python,Deployment,Cython,Setup.py,Python Packaging,我正在打包一个python项目,并寻找在外部文件上指定dpendencies的“正确”方法。我知道有多种方法可以指定dpendency,但我想知道这些方法实际上是如何工作的,它们之间有何区别,以及它们分别在哪个特定时间点生效 指定依赖项的已知方法(请参阅) 我们可以在setuptools.setup的install\u requires参数中指定依赖项 我们可以使用requirements.txt 我们可以使用setup.cfg 我的主要问题 不同方法的优缺点是什么 何时以及以何种顺序读取各个文

我正在打包一个python项目,并寻找在外部文件上指定dpendencies的“正确”方法。我知道有多种方法可以指定dpendency,但我想知道这些方法实际上是如何工作的,它们之间有何区别,以及它们分别在哪个特定时间点生效

指定依赖项的已知方法(请参阅)

  • 我们可以在
    setuptools.setup的
    install\u requires
    参数中指定依赖项
  • 我们可以使用
    requirements.txt
  • 我们可以使用
    setup.cfg
  • 我的主要问题

  • 不同方法的优缺点是什么
  • 何时以及以何种顺序读取各个文件中的信息?例如,pip是否会首先执行
    setup.py
    ,然后检查
    requirements.txt
  • 如果我仅以上面给出的一种方式指定需求,会发生什么情况?如果我以不同的方式指定不同的需求,会发生什么
  • 激励示例


    我需要创建一个使用
    cython
    numpy
    的包。如图所示,例如,
    cython
    (类似地,
    numpy
    ,必须在调用
    setuptools.setup
    之前导入。因此,
    setup.py
    将在库不可用时引发一个
    ImportError
    。我如何使需求可见,以便在调用
    setup.py
    之前安装必要的包?我是否应该移动编译到另一个文件,然后从
    setup.py
    调用该文件?我该怎么做?

    这些是许多广泛的问题。很难给出详尽的答案,也很难将意见置之不理


    严格地说,在打包Python项目时,我相信pip的“需求”文件既不常用也不常用(当然也有反例,但我认为它们通常不是打包的好主意)。但在其他一些用例中,我相信它们非常有用

    如果setuptools用于打包(有完全有效的替代方案),那么
    install\u requires
    是声明项目直接依赖关系的方法。除非没有其他方法,否则我建议放置整个setuptools配置(包括
    install\u requires
    )在
    setup.cfg
    文件中,而不是作为
    setuptools.setup()
    的参数。在这两种情况下,结果将完全相同,但是(正如现在普遍接受的那样)对于配置,静态声明性文件比可执行代码更适合。至于优先顺序,我相信
    setuptools.setup()
    参数将覆盖从
    setup.cfg
    读取的相同配置项

    例如,pip是否会首先执行
    setup.py
    ,然后检查
    requirements.txt

    这是两个不同的东西。需求文件或多或少是一个要安装的项目列表。每个项目可能以不同的方式打包(setuptools或其他)和分发(源代码或预构建的控制盘),有些项目需要执行
    setup.py
    有些项目不需要。但是,在打包时(和分发)一个项目通常不需要处理需求文件(当项目是一个库时永远不需要,当项目是一个应用程序时也不需要,请参阅)

    我不想详细讨论Cython和setuptools的结合问题。这将是一个很好的补充问题。这两个链接可能会帮助您开始:


    这可能会解决您的问题@ead谢谢您给我指出这个链接。这可能会解决我的特定问题。尽管如此,我还是有兴趣更好地理解整个过程。因此,我也在寻找更一般问题的答案。这个平台并不是真正用来回答这样一个问题的,实际上是多个广泛的问题合一。最好是分别提出多个重点问题。
    install\u requires
    requirements.txt
    服务于不同的目的,即使有重叠。对于@sinoroc,我感谢您努力保持这个平台干净,并且只提出合适的问题。我已经看到(并从中受益)不过,类似的问题也是如此。我对需求规范之间的比较感兴趣。我还没有找到这方面的信息来源。例如,在您的链接中,没有给出
    *.toml
    文件是什么以及它适合什么用途的信息。我可能能够实现这一点,但不知道我在做什么。我想要理解。完整的答案相当长,而且很可能不可避免地过于固执己见。我们可以利用这些评论一起找出更为集中的问题。例如,询问有关cython with setuptools问题的澄清是一个有效、独立且有趣的问题(答案是关于).
    install\u requires
    vs.
    requirements.txt
    也是一个有效的问题,但已经回答了多次。我相信,一个好的介绍可能是: