我正在寻找一种在安装阶段在python(扩展)模块中包含某些功能的方法。
以实际方式:
我有一个python库,它有两个相同功能的实现,一个内部(慢)和一个依赖于外部库(快速,在C中)。
我希望这个库是可选的,可以在编译/安装时使用如下标志激活:
python setup.py install # (it doesn't include the fast library)
python setup.py --enable-fast install
我必须使用Distutils,但所有解决方案都被广泛接受!
答案 0 :(得分:4)
distutils的文档包括a section on extending the standard functionality。相关建议似乎是从distutils.command.*
模块(例如build_py
或install
)继承相关类,并告诉setup
使用您的新版本(通过{ {1}}参数,它是将命令映射到用于执行它们的类的字典。查看任何命令类的来源(例如the install command),以便更好地了解添加新选项时必须做什么。
答案 1 :(得分:2)
你想要的一个例子是sqlalchemy的cextensions,它们专门用于同一目的 - 更快的C实现。为了了解SA如何实现它,您需要查看2个文件:
1)setup.py。从下面的摘录中可以看出,他们使用setuptools
和distutils
来处理案例:
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实现。