setup.py添加选项(又名setup.py --enable-feature)

时间:2010-04-25 18:05:10

标签: python packaging distutils

我正在寻找一种在安装阶段在python(扩展)模块中包含某些功能的方法。

以实际方式:

我有一个python库,它有两个相同功能的实现,一个内部(慢)和一个依赖于外部库(快速,在C中)。

我希望这个库是可选的,可以在编译/安装时使用如下标志激活:

python setup.py install # (it doesn't include the fast library)
python setup.py --enable-fast install

我必须使用Distutils,但所有解决方案都被广泛接受!

2 个答案:

答案 0 :(得分:4)

distutils的文档包括a section on extending the standard functionality。相关建议似乎是从distutils.command.*模块(例如build_pyinstall)继承相关类,并告诉setup使用您的新版本(通过{ {1}}参数,它是将命令映射到用于执行它们的类的字典。查看任何命令类的来源(例如the install command),以便更好地了解添加新选项时必须做什么。

答案 1 :(得分:2)

你想要的一个例子是sqlalchemycextensions,它们专门用于同一目的 - 更快的C实现。为了了解SA如何实现它,您需要查看2个文件:

1)setup.py。从下面的摘录中可以看出,他们使用setuptoolsdistutils来处理案例:

try:
    from setuptools import setup, Extension, Feature
except ImportError:
    from distutils.core import setup, Extension
    Feature = None

稍后会检查if Feature:,并使用变量extra为每个案例正确配置扩展程序,稍后会将其添加到setup()函数中。

2)base.py:这里看看如何定义BaseRowProxy

try:
    from sqlalchemy.cresultproxy import BaseRowProxy
except ImportError:
    class BaseRowProxy(object):
        #....

所以基本上一旦安装了C扩展(在安装过程中使用--with-cextensions标志),就会使用C实现。否则,使用类/函数的纯Python实现。