我想使用
Cython
向 extra_compile_args
编译器传递一些额外的选项。
我的
setup.py
:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Test app',
ext_modules = cythonize("test.pyx", language="c++", extra_compile_args=["-O3"]),
)
但是,当我运行
python setup.py build_ext --inplace
时,我收到以下警告:
UserWarning: got unknown compilation option, please remove: extra_compile_args
问题: 如何正确使用
extra_compile_args
?
我在
Cython 0.23.4
下使用 Ubuntu 14.04.3
。
使用更传统的方式而不使用
cythonize
来提供额外的编译器选项:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'Test app',
ext_modules=[
Extension('test',
sources=['test.pyx'],
extra_compile_args=['-O3'],
language='c++')
],
cmdclass = {'build_ext': build_ext}
)
Mike Muller 的答案有效,但在当前目录中构建扩展,而不是当
.pyx
给出时在 --inplace
文件旁边构建扩展,如下所示:
python3 setup.py build_ext --inplace
所以我的解决方法是编写一个 CFLAGS 字符串并覆盖 env 变量:
os.environ['CFLAGS'] = '-O3 -Wall -std=c++11 -I"some/custom/paths"'
setup(ext_modules = cythonize(src_list_pyx, language = 'c++'))
还有另一种方法可以做到这一点,我发现它是其他两种方法中最好的一种,因为通过这种方法,您仍然可以以通常的方式使用所有常规
cythonize
参数:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(
name="Test app",
ext_modules=cythonize(
Extension(
"test_ext", ["test.pyx"],
extra_compile_args=["-O3"],
language="c++",
),
),
)
替代方案(一般不适用,但如果您只想更改一个文件,可能会很有用):
将 特殊标题注释
# distutils: extra_compile_args = -O3
或 # cython: extra_compile_args = -O0
添加到 .pyx
文件顶部。
详细说明(如下http://docs.cython.org/en/latest/src/quickstart/build.html):
创建
hello.pyx
(逐字C代码用于检测是否启用优化)
cdef extern from *:
"""
#if __OPTIMIZE__
int optimizing = 1;
#else
int optimizing = 0;
#endif
"""
int optimizing
print(optimizing)
运行
python setup.py build_ext --inplace && python -c "import hello"
— 输出为 1
。
在
# distutils: extra_compile_args = -O0
顶部添加hello.pyx
。
再次运行命令,输出为
0
。