Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用distutils/setuptools配置扩展模块_Python_Setuptools_Distutils - Fatal编程技术网

Python 使用distutils/setuptools配置扩展模块

Python 使用distutils/setuptools配置扩展模块,python,setuptools,distutils,Python,Setuptools,Distutils,我有一个Python项目,其中有多个用C编写的扩展模块,这些模块与第三方库进行通信。但是,根据用户的环境和选项,不应构建某些模块,而应启用/禁用某些编译器标志。问题是我必须在调用setup()之前构建扩展模块列表,理想情况下,我希望使用distutils.Command子类来处理用户选项。现在我有几个选择: 在构建模块之前,需要运行“python setup.py configure”命令,将信息存储在pickle文件中,并在下次脚本运行时使用它生成扩展名列表。这就是我的项目目前的工作方式,这似

我有一个Python项目,其中有多个用C编写的扩展模块,这些模块与第三方库进行通信。但是,根据用户的环境和选项,不应构建某些模块,而应启用/禁用某些编译器标志。问题是我必须在调用setup()之前构建扩展模块列表,理想情况下,我希望使用distutils.Command子类来处理用户选项。现在我有几个选择:

  • 在构建模块之前,需要运行“python setup.py configure”命令,将信息存储在pickle文件中,并在下次脚本运行时使用它生成扩展名列表。这就是我的项目目前的工作方式,这似乎很愚蠢

  • 手动从sys.argv中删除选项并使用它们生成列表。这不是一个长期的解决方案,因为我最终希望在构建之前运行一些脚本来检查设置

  • 从distutils生成build_ext子类,在run()方法开始时进行配置(可能还使用通过(2)发送的选项),并在生成之前直接修改self.distribution.ext_模块。但是,我担心这可能会混淆setuptools,因为它可能假定在调用setup()时扩展模块列表是固定的。这还意味着,当使用build_ext以外的命令调用setup()时,扩展模块列表为空


  • 有什么更好的方法可以做到这一点吗?

    我自己在更改distutils方面的经验很薄弱,也很不稳定,所以我只能提供一些指针。看看numpy。它有一个完整的子模块(numy.distutils),其中包含处理(或绕过)distutils的方法。否则,请询问distutils邮件列表。

    我将对distutils.core.Distribution进行子类化,并将其与distutils.core.setup(distclass=CustomDistribution)一起传递。这使您能够以与正常设置相同的方式访问命令行参数,您可以在
    CustomDistribution.\uuuu init\uuuu
    方法中调整扩展列表。但我同意dalke的观点,分离的方式充满了痛苦

    有没有更好的方法

    根据我与其他人的模块一起工作的经验,我可以说,在正确的方法上肯定没有达成共识

    我曾经尝试过并拒绝过对distutil进行子类化——我发现在不同的Python版本和不同的系统中工作是很脆弱和困难的

    对于我们的代码,在尝试了您正在考虑的类型之后,我决定在主调用之前在setup.py中进行检测和配置
    setup()
    。诚然,这有点难看,但这意味着有人试图编译你的东西,有一个地方可以找出,例如,为什么include路径是错误的。(他们当然不需要是distutils内部的专家)。

    config命令被设计成子类,并被像您这样有需求的项目使用