我正在寻找一种在安装阶段在python (扩展)模块中包含一些功能的方法。
以实际的方式:
我有一个python库,它有两个相同函数的实现,一个是内部的(慢的),另一个是依赖于外部的(快速的,用C编写的)。
我希望这个库是可选的,可以在编译/安装时使用如下标志激活:
python setup.py install # (it doesn't include the fast library)
python setup.py --enable-fast install我必须使用Distutils,但是所有的解决方案都是可以接受的!
发布于 2010-04-26 04:43:58
你想要的一个例子就是sqlalchemy的cextensions,它们是专门为相同的目的而设计的--更快的C实现。
1) setup.py。从下面的摘录中可以看到,它们使用setuptools和distutils处理情况
try:
from setuptools import setup, Extension, Feature
except ImportError:
from distutils.core import setup, Extension
Feature = None稍后将使用变量extra为每种情况正确配置检查if Feature:和扩展,该变量后来被添加到setup()函数中。
2) base.py:这里看看BaseRowProxy是如何定义的:
try:
from sqlalchemy.cresultproxy import BaseRowProxy
except ImportError:
class BaseRowProxy(object):
#....因此,基本上一旦安装了C扩展(在安装过程中使用--with-cextensions标志),就会使用C实现。否则,将使用类/函数的纯Python实现。
发布于 2010-04-26 02:24:56
distutils的文档包括a section on extending the standard functionality。相关的建议似乎是从distutils.command.*模块(如build_py或install)中子类化相关的类,并告诉setup使用您的新版本(通过cmdclass参数,这是一个将命令映射到用于执行命令的类的字典)。查看任何命令类的源代码(例如the install command),以便更好地了解如何添加新选项。
https://stackoverflow.com/questions/2709278
复制相似问题