xticks barplot python compiler-errors cython distutils

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.



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.