如何在定义cython扩展之前识别编译器?

Pyr*_*rce 5 setuptools cython

我正在构建一个独立于平台的cython项目,我希望根据所使用的编译器传递编译器args.我可以根据平台猜测编译器,或者假设它与Python使用的编译器相同,但不能保证匹配.通常我将cmdclassarg 注入到setuptool的setup方法中并包装install或build_ext命令来检查内部状态.但在这种情况下,我必须在到达包装器之前对扩展模块进行cython化.

在对扩展模块进行cython化之前,有没有办法确定setup.py中的编译器?

Pyr*_*rce 4

在 cython 论坛上发帖并在 distutils 中搜索相关问题后,我发现这篇文章展示了如何将编译器参数移动到 build_ext 分配中。如果我随后从扩展类中删除所有编译器参数,我现在可以按照我的预期在命令类中延迟分配它们。我也可以获得installegg_info命令类来调用我的新版本的 build_ext。

from setuptools.command.build_ext import build_ext

BUILD_ARGS = defaultdict(lambda: ['-O3', '-g0'])
for compiler, args in [
        ('msvc', ['/EHsc', '/DHUNSPELL_STATIC']),
        ('gcc', ['-O3', '-g0'])]:
    BUILD_ARGS[compiler] = args
    
class build_ext_compiler_check(build_ext):
    def build_extensions(self):
        compiler = self.compiler.compiler_type
        args = BUILD_ARGS[compiler]
        for ext in self.extensions:
            ext.extra_compile_args = args
        build_ext.build_extensions(self)

...
setup(
    ...
    cmdclass={ 'build_ext': build_ext_compiler_check })
Run Code Online (Sandbox Code Playgroud)