使用distutils/setuptools配置扩展模块

6
我有一个Python项目,其中包含多个用C编写的扩展模块,它们与第三方库进行通信。然而,根据用户的环境和选项,有些模块不应该被构建,有些编译器标志应该启用/禁用。问题是,在调用setup()之前,我必须构建扩展模块列表,并且理想情况下,我希望使用distutils.Command子类来处理用户选项。目前我有几个选择:
  1. 要求在构建模块之前运行“python setup.py configure”命令,将信息存储在pickle文件中,并在下次运行脚本时使用它来生成扩展列表。这是我的项目目前的工作方式,看起来相当愚蠢。
  2. 手动从sys.argv中提取选项并使用它们构建列表。这不是长期解决方案,因为我最终希望运行一些脚本来检查设置。
  3. 从distutils中继承build_ext, 在run()方法的开头进行配置(可能还使用通过(2)发送的选项),并在构建之前直接修改self.distribution.ext_modules。但我担心这可能会让setuptools感到困惑,因为它可能会认为在调用setup()时扩展模块列表已经固定了。这也意味着,当使用build_ext以外的命令调用setup()时,扩展模块列表为空。
有没有更好的方法来解决这个问题?
4个回答

1
有没有一种首选的方法来做这件事?
从我与其他人的模块合作的经验来看,我可以说并没有就正确的方法达成共识。
我曾尝试过并拒绝了子类化distutils的部分——我发现它很脆弱,并且难以在不同的Python版本和不同的系统上工作。
对于我们的代码,在尝试了您正在考虑的类型的事情之后,我已经决定在主调用setup()之前在setup.py中进行检测和配置。这显然有点丑陋,但这意味着想要编译您的东西的人只需要在一个地方找出例如为什么包含路径错误的原因。(而他们肯定不需要成为distutils内部的专家)。

0

我自己在更改distutils方面的经验很弱,所以我能提供的只是指针。看看numpy吧。它有一个完整的子模块(numpy.distutils),可以用来处理(或绕过)distutils。否则,请向distutils邮件列表提问。


0
我会子类化distutils.core.Distribution,并通过distutils.core.setup(distclass=CustomDistribution)传递它 - 这样可以让您以与正常设置相同的方式访问命令行参数,并且您可以在CustomDistribution.__init__方法中执行诸如调整扩展列表之类的操作。但是我同意dalke的观点,distutils的方式充满了痛苦...

0

config命令旨在被子类化并由具有类似要求的项目使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接