Python打包:指定外部需求的不同方法-差异、优势和建议
我正在打包一个python项目,并寻找在外部文件上指定dpendencies的“正确”方法。我知道有多种方法可以指定dpendency,但我想知道这些方法实际上是如何工作的,它们之间有何区别,以及它们分别在哪个特定时间点生效 指定依赖项的已知方法(请参阅)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 我的主要问题 不同方法的优缺点是什么 何时以及以何种顺序读取各个文
setuptools.setup的install\u requires
参数中指定依赖项
requirements.txt
setup.cfg
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的结合问题。这将是一个很好的补充问题。这两个链接可能会帮助您开始:
install\u requires
和requirements.txt
服务于不同的目的,即使有重叠。对于@sinoroc,我感谢您努力保持这个平台干净,并且只提出合适的问题。我已经看到(并从中受益)不过,类似的问题也是如此。我对需求规范之间的比较感兴趣。我还没有找到这方面的信息来源。例如,在您的链接中,没有给出*.toml
文件是什么以及它适合什么用途的信息。我可能能够实现这一点,但不知道我在做什么。我想要理解。完整的答案相当长,而且很可能不可避免地过于固执己见。我们可以利用这些评论一起找出更为集中的问题。例如,询问有关cython with setuptools问题的澄清是一个有效、独立且有趣的问题(答案是关于).install\u requires
vs.requirements.txt
也是一个有效的问题,但已经回答了多次。我相信,一个好的介绍可能是: