我有一个Python项目,其中包含用C编写的多个扩展模块,它们与第三方库进行通信。但是,根据用户的环境和选项,不应构建某些模块,并且应启用/禁用某些编译器标志。问题是我必须在调用setup()之前构建扩展模块列表,理想情况下我想使用distutils.Command子类来处理用户选项。现在我有几个选择:
在构建模块之前需要运行“python setup.py configure”命令,将信息存储在pickle文件中,并在下次运行脚本时使用它来生成扩展列表。这就是我的项目目前的工作方式,这看起来很傻。
手动从sys.argv中删除选项并使用它们来构建列表。这不是一个长期的解决方案,因为我最终会想要在构建之前运行一些脚本来检查设置。
来自distutils的子类build_ext,在run()方法的开头执行我的配置(可能还使用通过(2)发送的选项)并在构建之前直接修改self.distribution.ext_modules。但是,我担心这可能会混淆setuptools,因为它可能会在调用setup()时修复扩展模块列表。这也意味着当使用除build_ext之外的命令调用setup()时,扩展模块列表为空。
有没有首选的方法呢?
答案 0 :(得分:1)
有没有首选的方法呢?
根据我与其他人的模块合作的经验,我可以说在正确的方法上肯定没有达成共识。
我已经尝试并拒绝了子类的distutils - 我发现它很脆弱,难以在不同的Python版本和不同的系统中工作。
对于我们的代码,在尝试了您正在考虑的事物类型之后,我已经决定在主调用之前在setup.py中进行检测和配置。
setup()
。这无疑是有点丑陋,但这意味着有人试图编译你的东西有一个地方可以找到,例如为什么包含路径是错误的。 (他们当然不需要成为distutils内部的专家)。
答案 1 :(得分:0)
我自己改变distutils的经验一直很弱而且不稳定,所以我能提供的只是指针。看看numpy。这有一个完整的子模块(numpy.distutils),有方法可以处理(或解决)distutils。否则,请询问distutils邮件列表。
答案 2 :(得分:0)
我会将distutils.core.Distribution
子类化并将其传递给distutils.core.setup(distclass=CustomDistribution)
- 这使您可以像使用普通设置一样访问命令行参数,并且可以执行调整CustomDistribution.__init__
方法中的扩展名列表。但我同意达尔克的观点,因为苦恼的方式充满痛苦......
答案 3 :(得分:0)
config命令设计为子类,并由具有类似要求的项目使用。