4

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

以实际的方式:

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

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

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

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

4

2 回答 2

4

distutils 的文档包括关于扩展标准功能的部分。相关建议似乎是将模块中的相关类distutils.command.*(例如build_pyor install)子类化并告诉setup使用您的新版本(通过cmdclass参数,这是一个字典,将命令映射到用于执行它们的类)。查看任何命令类的源代码(例如install 命令),以很好地了解添加新选项需要做什么。

于 2010-04-25T18:24:56.250 回答
2

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

1)设置.py。正如您从下面的摘录中看到的那样,他们使用setuptools和处理案例distutils

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

稍后进行检查if Feature:,并使用 variable 为每种情况正确配置扩展extra,稍后将其添加到setup()函数中。

2)base.py:这里看看是怎么BaseRowProxy定义的:

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

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

于 2010-04-25T20:43:57.887 回答