Distutils de Python que no usan la versión correcta de gcc

Estoy tratando de comstackr un paquete en Mac OSX 10.6.5. El script de instalación del paquete se basa en distutils. El problema es que el gcc predeterminado de la computadora es la versión 4.2 (lo determiné simplemente ejecutando gcc –version en una ventana de terminal) pero cuando ejecuto ‘python setup.py build’, veo en la salida que los distritos eligen gcc -4.0 en lugar de 4.2 Este es un gran problema porque el código que estoy usando requiere gcc> = 4.2. No tengo derechos de administrador en esta máquina, así que como workaroud, creé algunos enlaces simbólicos que envían gcc-4.0 a gcc-4.2. El resultado es el código que se comstack, pero los archivos .so generados no funcionan (cuando bash importarlos en Python, me aparecen errores quejándose de una función init que falta en el objeto compartido).

He intentado comstackr este código en un mac diferente (10.6.6) y funciona a la perfección: distutils elige 4.2 sin que me obliguen a hacerlo y puedo importar el objeto compartido generado sin problemas. Entonces, lo que me gustaría hacer es comstackr el código en mi computadora sin tener que hacer este truco de enlaces simbólicos … Solo quiero que Distutils elija 4.2 automáticamente como debería. He intentado tomar los archivos .so que se comstackn correctamente y transferirlos a mi computadora, pero esto falla por varias razones (están vinculados a bibliotecas que no están presentes en mi máquina / son una versión diferente a las instaladas).

¿Alguien tiene algún consejo aquí?

Gracias, Josh

Para forzar a los distritos a usar un comstackdor separado, puede redefinir algunas variables a través del entorno. Primero, averigüe qué distutils está usando como valores por defecto:

>>> from distutils import sysconfig >>> sysconfig.get_config_var('LDSHARED') 'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup' >>> sysconfig.get_config_var('CC') 'gcc-4.0' 

A continuación, debe redefinirlos, sustituyendo en la versión de gcc que le gustaría usar:

 % LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \ /usr/bin/python setup.py build_ext 

Tenga en cuenta que los valores predeterminados de sysconfig se extraen del Makefile que originalmente se usó para comstackr python, por lo que la falsificación con ellos puede producir resultados no deseados:

 >>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1) >>> os.path.join(path, 'config', 'Makefile') '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile' 

¿Has intentado configurar una variable de entorno CC personalizada?

 CC=gcc-4.2 python setup.py build 

No dice qué versiones de Python está usando, pero es probable que el Python predeterminado en la máquina que está usando no sea el Python 2.6.1 suministrado por Apple, más probablemente uno instalado desde python.org. Intente ejecutar el script de comstackción con /usr/bin/python2.6 que debería ser el Python 2.6 suministrado por Apple; que sí usa gcc-4.2 .

Cuando usa Distutils de Python (normalmente ejecutando un script setup.py o usando easy_install ), Distutils intenta asegurarse de que cualquier módulo de extensión C en el paquete que está instalando se comstackrá con la misma versión del comstackdor y con opciones de comstackción compatibles (CPU archs, ABI, etc) como se usó para construir Python. Tradicionalmente, la mayoría de los instaladores de python.org para OS X proporcionan un Python universal que funciona en varias versiones de OS X y múltiples arcos de CPU. Es por eso que están construidos con gcc-4.0. Si necesita usar gcc-4.2 para alguna otra biblioteca, entonces lo más seguro es usar un Python que fue construido con gcc-4.2. El sistema suministrado por Apple Pythons en OS X 10.6 está construido de este modo. Además, para las versiones más recientes de Python (2.7.1 y 3.2), python.org proporciona una segunda variante de instalación de OS X para OS X 10.6 que también se construye con gcc-4.2. Pero si no tiene acceso de administrador a su máquina, esa no es una opción de todos modos.

Puedes ver qué python se está utilizando de forma predeterminada por:

 which python 

Puede ajustar su distutils.cfg (ver aquí ) o puede pasar argumentos de línea de comando como –compiler = gcc42 (no está seguro acerca del último).