gpt4 book ai didi

python - 使用 Cython 和 setuptools 编译多个扩展时设置默认编译器

转载 作者:行者123 更新时间:2023-11-28 18:16:57 25 4
gpt4 key购买 nike

我目前有一个项目,我们大量使用 Cython 来加速我们所有的子模块/类,我希望在 Linux 上用 clang 而不是 gcc 编译它们系统。为此,我目前有一个函数可以通过以下方式收集所有扩展:

def extensions():
try:
from Cython.Build import cythonize
except ImportError:
def cythonize(*args, **kwargs):
print("Hint: Wrapping import of cythonize in extensions()")
from Cython.Build import cythonize
return cythonize(*args, **kwargs)

try:
import numpy
lstIncludes = [numpy.get_include()]
except ImportError:
lstIncludes = []

extensionArguments = {
'include_dirs':
lstIncludes + ['package/core', 'package/inspect', 'util'],
'extra_compile_args': compilerArguments,
'extra_link_args': linkerArguments,
'define_macros': defineMacros
}

return cythonize(
[Extension("*", ["package/*.pyx"], **extensionArguments),
Extension("*", ["package/algs/*.pyx"], **extensionArguments),
Extension("*", ["package/core/*.pyx"], **extensionArguments)],
compiler_directives=cythonDirectives)

此外,我设置

os.environ["CC"] = "clang"
os.environ["CXX"] = "clang"

setup.py 中,当我调用 python setup.py build_ext --inplace 时,第一个 Cython 扩展是使用 clang 构建的,但是第二个是用 gcc 构建的。这种行为不会改变,如果我调用

export CC=clang; python setup.py build_ext --inplace

然后,第一个未编译的 cythonized 扩展是使用 clang 构建的,但第二个和所有后续的都是再次使用 gcc 构建的。

如何在编译期间为所有 Cython 模块设置和修复编译器?

编辑:经过几周的考虑,我仍然没有解决上述问题,而且它也发生在多台机器上,所以这不是我特定设置的结果。

最佳答案

我终于发现,有必要强行覆盖 disutils 从我们的系统配置中提取的内容。为此,必须通过如下修改上述代码来为每个扩展分别设置某些选项

from distutils import sysconfig

def extensions():
'''
Handle generation of extensions (a.k.a "managing cython compilery").
'''
try:
from Cython.Build import cythonize
except ImportError:
def cythonize(*args, **kwargs):
print("Hint: Wrapping import of cythonize in extensions()")
from Cython.Build import cythonize
return cythonize(*args, **kwargs)

try:
import numpy
lstIncludes = [numpy.get_include()]
except ImportError:
lstIncludes = []

extensionArguments = {
'include_dirs':
lstIncludes + ['package/core', 'package/inspect', 'util'],
'extra_compile_args': compilerArguments,
'extra_link_args': linkerArguments,
'define_macros': defineMacros
}

# me make damn sure, that disutils does not mess with our
# build process

sysconfig.get_config_vars()['CFLAGS'] = ''
sysconfig.get_config_vars()['OPT'] = ''
sysconfig.get_config_vars()['PY_CFLAGS'] = ''
sysconfig.get_config_vars()['PY_CORE_CFLAGS'] = ''
sysconfig.get_config_vars()['CC'] = 'gcc'
sysconfig.get_config_vars()['CXX'] = 'g++'
sysconfig.get_config_vars()['BASECFLAGS'] = ''
sysconfig.get_config_vars()['CCSHARED'] = '-fPIC'
sysconfig.get_config_vars()['LDSHARED'] = 'gcc -shared'
sysconfig.get_config_vars()['CPP'] = ''
sysconfig.get_config_vars()['CPPFLAGS'] = ''
sysconfig.get_config_vars()['BLDSHARED'] = ''
sysconfig.get_config_vars()['CONFIGURE_LDFLAGS'] = ''
sysconfig.get_config_vars()['LDFLAGS'] = ''
sysconfig.get_config_vars()['PY_LDFLAGS'] = ''

return cythonize(
[Extension("*", ["package/*.pyx"], **extensionArguments),
Extension("*", ["package/algs/*.pyx"], **extensionArguments),
Extension("*", ["package/core/*.pyx"], **extensionArguments)],
compiler_directives=cythonDirectives,
nthreads=4
)

通过这种方式,人们可以完全控制构建扩展时发生的任何事情。

关于python - 使用 Cython 和 setuptools 编译多个扩展时设置默认编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com