在setup.py中基于解释器版本在安装时解析Python依赖项



假设我有一堆需求文件,比如:

requirements.txt   # common for both 2.x and 3.x
requirements-2.txt # 2.x
requirements-3.txt # 3.x

并且我想基于当前Python解释器版本在CCD_ 2文件中填充CCD_。当然,假设pip处理安装过程。

解决方案1:当然,我可以编写一个简单的函数来读取并返回正确的需求。在有多个项目的情况下,这显然是不可接受的,因为我将不得不到处复制函数。

解决方案2:这里的下一个想法是编写一个简单的软件包来为我做这件事,但问题是它不仅应该在分发时(如python setup.py sdist)可用,更重要的是,应该在机器上的安装时可用。

我设法编写了一个简单的模块来做这件事,让我们称之为depmodule。我还有以下setup.py:

# -*- coding: utf-8 -*-
from setuptools import setup, find_packages
try:
from depmodule import find_requirements
except ImportError:
# this line is executed when reading setup.py for the first time
# since depmodule is not installed yet
find_requirements = lambda: []
setup(
name='some-package',
packages=find_packages(),
# snip...
platforms='any',
# note that depmodule is listed here as a requirement, so it will be
# installed before some-package, thus will be available when it comes
# to running setup.py of some-package
install_requires=['depmodule'] + find_requirements(),
)

当涉及到pip install some-package时,它实际上正确地解析了依赖项,但它们不会被pip获取,因此它只安装:depmodule some-package(按顺序)而不是depmodule dep1 dep2 ... some-package

我尝试使用setup_requires参数,但没有成功。依赖项已下载,但我无法访问它,因为它是一个egg包(未提取)。

我有什么办法可以克服这个问题吗?有什么替代方案(其他方法)可以帮助解决这个问题吗?

谢谢!

由于您不想为多个项目复制代码,您可以考虑从单个源生成install_requires0和/或更新setup.py的某些部分。这将类似于从Makefile.in模板生成Makefile

我有一个py_setup程序。我用py_setup --new调用它,在当前目录中生成一个新的setup.py,将py_setup的部分作为模板。当py_setup为以文件名为参数运行时,它会尝试更新该文件中的段,但不影响其余部分。当在没有参数和选项的情况下运行时,py_setup会更新所有*/setup.py文件上的段。

py_setup(和setup.py文件)中的段由形式为setup.py0的注释行分隔或以#_#结尾。段之前或段之间的任何内容都会被复制,但永远不会在setup.py中更新py_setup中#_###行之后的任何内容都不会被复制,这就是实际的代码,即实际的py_setup程序代码

除了分段分隔符注释(在分段名称后去掉)和以开头的行外,大多数行都是逐字复制的

setup = setup

从那一行开始,setup =在开始时被剥离,因此它最终会调用setup.py中的setup(),但在运行py_setup时不会调用。

更新时,只有目标setup.py中的现有段才会被py_setup中相同命名段的行替换。删除或更改段名称可以确保不会对代码进行更改。

最新更新