python - barplot - pandas plot
¿Cómo decirle a distutils que usen gcc? (5)
Quiero envolver un proyecto de prueba que contenga código C ++ y OpenMP con Cython, y compilarlo con distutils a través de un archivo setup.py
. El contenido de mi archivo se ve así:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
modules = [Extension("Interface",
["Interface.pyx", "Parallel.cpp"],
language = "c++",
extra_compile_args=["-fopenmp"],
extra_link_args=["-fopenmp"])]
for e in modules:
e.cython_directives = {"embedsignature" : True}
setup(name="Interface",
cmdclass={"build_ext": build_ext},
ext_modules=modules)
El indicador -fopenmp
se usa con gcc para compilar y vincular contra OpenMP. Sin embargo, si acabo de invocar
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build
esta bandera no se reconoce, porque el compilador es clang:
running build
running build_ext
skipping ''Interface.cpp'' Cython extension (up-to-date)
building ''Interface'' extension
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Interface.cpp -o build/temp.macosx-10.8-x86_64-3.3/Interface.o -fopenmp
clang: warning: argument unused during compilation: ''-fopenmp''
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Parallel.cpp -o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -fopenmp
clang: warning: argument unused during compilation: ''-fopenmp''
Parallel.cpp:24:10: warning: unknown pragma ignored [-Wunknown-pragmas]
#pragma omp parallel for
^
1 warning generated.
c++ -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-3.3/Interface.o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -o build/lib.macosx-10.8-x86_64-3.3/Interface.so -fopenmp
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command ''c++'' failed with exit status 1
He intentado sin éxito especificar gcc:
cls ~/workspace/CythonOpenMP/src $ python3 setup.py build --compiler=g++-4.7
running build
running build_ext
error: don''t know how to compile C/C++ code on platform ''posix'' with ''g++-4.7'' compiler
¿Cómo puedo decirle a distutils que usen gcc?
En caso de que otros enfrenten el mismo problema en Windows (donde la variable de entorno CC no tendría ningún efecto):
- Crea el archivo "C: / Python27 / Lib / distutils / distutils.cfg" y escribe esto dentro:
Código:
[build]
compiler = mingw32
- Elimine todas las instancias de la opción gcc "-mno-cygwin" del archivo "C: / Python27 / Lib / distutils / cygwinccompiler.py":
Esta :
self.set_executables(compiler=''gcc -mno-cygwin -O -Wall'',
compiler_so=''gcc -mno-cygwin -mdll -O -Wall'',
compiler_cxx=''g++ -mno-cygwin -O -Wall'',
linker_exe=''gcc -mno-cygwin'',
linker_so=''%s -mno-cygwin %s %s''
% (self.linker_dll, shared_option,
entry_point))
Se convierte en esto:
self.set_executables(compiler=''gcc -O -Wall'',
compiler_so=''gcc -mdll -O -Wall'',
compiler_cxx=''g++ -O -Wall'',
linker_exe=''gcc'',
linker_so=''%s %s %s''
% (self.linker_dll, shared_option,
entry_point))
El segundo punto puede ser necesario si está utilizando una versión reciente de gcc, donde se ha eliminado la opción en desuso -mno-cygwin
.
Espero que esto ayude, incluso si no está directamente relacionado con las necesidades reales del OP (pero aún está relacionado con el título de la pregunta ...)
Intente configurar la variable de entorno "CC" desde dentro de setup.py con os.environ.
Pruebe esto: http://mail.python.org/pipermail/distutils-sig/2002-August/002944.html
En resumen, parece que deberías probar: python setup.py build --compiler = g ++ primero.
Puedes intentar instalar anaconda env:
conda create -n py35a python=3.5 numpy scipy matplotlib pandas gcc anaconda
construir con:
zsh -c ". activate py35a && gcc --version && python setup.py build_ext --inplace"
Simplemente eché un vistazo a la fuente distutils
, y la opción --compiler
espera "unix", "msvc", "cygwin", "mingw32", "bcpp" o "emx". Comprueba el nombre del compilador que desea al verificar la variable de entorno CC
. Intenta llamar a compilar de esta manera:
CC=gcc python setup.py build
No es necesario configurar CXX
, no lo comprueba.