Python 整理gcc使用的Cython构建标志

Python 整理gcc使用的Cython构建标志,python,cython,setuptools,compiler-flags,cythonize,Python,Cython,Setuptools,Compiler Flags,Cythonize,我目前使用“setuptools”在Linux上使用gcc自动Cython化和编译Cython模块。从现在起,我需要更多地控制提供给gcc的构建标志。如果我在我的setup.py中使用以下内容: cythonize( [Extension("*", ["project/*.pyx"]) nthreads=4 ) 我得到的构建标志如下所示: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3

我目前使用“setuptools”在Linux上使用gcc自动Cython化和编译Cython模块。从现在起,我需要更多地控制提供给gcc的构建标志。如果我在我的
setup.py中使用以下内容:

cythonize(
    [Extension("*", ["project/*.pyx"])
    nthreads=4
)
我得到的构建标志如下所示:

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -fPIC -I./fastmat/core -I/home/seb/.local/lib/python3.6/site-packages/numpy/core/include -Iproject/core -Ifastmat/inspect -Iutil -I/usr/include/python3.6m -c project/BlockDiag.c -o build/temp.linux-x86_64-3.6/project/BlockDiag.o
在这里,我完全震惊于这样一个事实:几个构建标志多次出现,并且没有以任何(对我来说显而易见的)方式发布


我如何清理这些构建标志,使它们看起来像建议的那样?我希望在此过程中了解一些关于setuptools的知识,以最终获得对构建过程的完全控制,而不必使用自我维护的makefile。

GCC获得的标志来自一个env变量。进入

$ python -c "from distutils import sysconfig;\
print(sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',\
'BASECFLAGS', 'LDFLAGS', 'CCSHARED', 'LDSHARED', 'SO'))"
打印它们。这是默认情况下
distutils
用于扩展编译的内容。现在检查哪个环境变量引入哪个标志,并相应地覆盖环境变量,例如

$ CC="gcc-7.3.0" CFLAGS="-Ofast" python setup.py build_ext
使用特定的编译器版本并启用
O3
优化


另外,看起来您使用的是
numpy.distutils
而不是香草
distutils
,因此请注意引擎盖下添加的额外包含/链接标志
numpy

谢谢!我通过使用
CC=“gcc”CXX=“g++”OPT=“”CFLAGS=”“BASECFLAGS=”“LDFLAGS=”“CCSHARED=“”LDSHARED=“gcc-shared”PY\u core=”“PY CFLAGS=”“SO=“”,将其清理到
gcc-DNDEBUG-g-fwrapv-O3-Wstrict原型-fPIC-I./fastmat/core[…]-o build/temp.linux-x86\u 64-3.6/fastmat/BlockDiag.o
python setup.py build\u ext--inplace
。现在我仍然想知道剩下的标志来自哪里,因为我搜索了字典,它是由
sysconfig.get\u config\u vars()
返回的,例如任何包含
-O3
的键,并将其设置为
,但它仍然会继续弹出。为了澄清,我只是针对一些numpy libs进行了链接,但是我使用的是标准的distutils库。如果您在其中一个env变量中找不到设置的标志(仅供参考),那么供应商或发行版维护人员可能会将它们烘焙到
gcc
(您可以检查
gcc-dumpspecs
)。如果您需要一个普通的
gcc
,请从源代码构建一个,并通过
CC
var传递自定义可执行文件。