2012-09-18 11 views
8

Estoy compilando lxml en Mac OS X 10.8.1 y Python 2.7.2 y tengo problemas. (He clonado el repositorio de Github y seguí las instrucciones para Mac OS X aquí: http://lxml.de/build.html)¿Qué estoy haciendo mal al instalar lxml en Mac OS X 10.8.1?

Parece que algo se cuelga en la creación de libxml2; el siguiente es el extremo de la cola de la salida del terminal:

configure: creating ./config.status 
config.status: creating libxml2.spec 
config.status: creating Makefile 
config.status: creating include/Makefile 
config.status: creating include/libxml/Makefile 
config.status: creating doc/Makefile 
config.status: creating doc/examples/Makefile 
config.status: creating doc/devhelp/Makefile 
config.status: creating example/Makefile 
config.status: creating python/Makefile 
config.status: creating python/tests/Makefile 
config.status: creating xstc/Makefile 
config.status: creating include/libxml/xmlversion.h 
config.status: creating xml2-config 
config.status: creating libxml-2.0.pc 
config.status: creating libxml-2.0-uninstalled.pc 
config.status: creating python/setup.py 
config.status: creating config.h 
config.status: executing depfiles commands 
config.status: executing libtool commands 
rm: libtoolT: No such file or directory 
Done configuring 
make all-recursive 
Making all in include 
Making all in libxml 
make[3]: Nothing to be done for `all'. 
make[3]: Nothing to be done for `all-am'. 
Making all in . 
    CC  error.lo 

[snipped]

CC  hash.lo 
parser.c: In function 'xmlParseInNodeContext': 
parser.c:13492: warning: pointer targets in passing argument 1 of 'xmlFindCharEncodingHandler' differ in signedness 
    CC  list.lo 

[snipped]

CC  xpointer.lo 
xpath.c: In function 'xmlXPathRegisterFuncNS': 
xpath.c:4870: warning: ISO C forbids passing argument 4 of 'xmlHashAddEntry2' between function pointer and 'void *' 
xpath.c: In function 'xmlXPathFunctionLookupNS': 
xpath.c:4951: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: In function 'xmlXPathCompOpEval': 
xpath.c:13535: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c:13562: warning: ISO C forbids assignment between function pointer and 'void *' 
xpath.c: At top level: 
trionan.c:221: warning: 'trio_is_negative' defined but not used 
    CC  xinclude.lo 

[snipped]

CC  xmlstring.lo 
threads.c: In function 'xmlCleanupThreads': 
threads.c:918: error: expected expression before '{' token 
make[2]: *** [threads.lo] Error 1 
make[2]: *** Waiting for unfinished jobs.... 
make[1]: *** [all-recursive] Error 1 
make: *** [all] Error 2 
Traceback (most recent call last): 
    File "setup.py", line 225, in <module> 
    **setup_extra_options() 
    File "setup.py", line 139, in setup_extra_options 
    STATIC_CFLAGS, STATIC_BINARIES) 
    File "/Users/jedc/Downloads/lxml/setupinfo.py", line 57, in ext_modules 
    multicore=OPTION_MULTICORE) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 338, in build_libxml2xslt 
    cmmi(libxml2_configure_cmd, libxml2_dir, multicore, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 266, in cmmi 
    cwd=build_dir, **call_setup) 
    File "/Users/jedc/Downloads/lxml/buildlibxml.py", line 249, in call_subprocess 
    raise Exception('Command "%s" returned code %s' % (cmd_desc, returncode)) 
Exception: Command "make -j5" returned code 512 

I' m WAY fuera de mi profundidad tratando de descubrir ¿Qué pasa aquí? ¿Alguien puede indicarme qué debo hacer para solucionar esto?

Respuesta

17

Este es un error en libxml2 2.9.

El error que está recibiendo es en esta línea:

once_control = PTHREAD_ONCE_INIT; 

Eso es ilegal código, que sólo pasa a trabajar en Linux. PTHREAD_ONCE_INIT solo se puede utilizar para la inicialización, no para la asignación, y hay una razón específica para ello: para que las plataformas puedan definir PTHREAD_ONCE_INIT como un inicializador agregado. ¿Qué OS X hace? De 10.8.1 de /usr/include/pthread.h:

#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init, {0}} 

Parece que esto ha sido reportado a la lista de correo libxml2 hace unos días (https://mail.gnome.org/archives/xml/2012-September/msg00036. html), archivado en bugzilla dos días después (https://bugzilla.gnome.org/show_bug.cgi?id=684024), y corregido al día siguiente (http://git.gnome.org/browse/libxml2/commit /? id = 3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e), por lo que presumiblemente 2.9.1 no tendrá este problema.

lo tanto, aquí están sus opciones:

supuesto, usted podría esperar a 2.9.1 a salir.

Alternativa, a pesar de lo que dice la página de compilación, la versión de libxml2 que viene con Mountain Lion, 2.7.8, no está "terriblemente desactualizada", es más nueva que la versión 2.7.3 que sugiere usar. Por lo tanto, puede omitir el --static-deps y usar el 2.7.8 incorporado.

Si desea algo más nuevo que 2.7.8, pero no tan nuevo como el 2.9.0 (que no funciona), la página de compilación muestra cómo especificarlo explícitamente, y http://www.xmlsoft.org debe tener el historial de versiones en alguna parte para que pueda puede elegir la versión que desee. Por ejemplo:

python setup.py build --static-deps \ 
    --libxml2-version=2.8.0 

O puede aplicar manualmente el parche de http://git.gnome.org/browse/libxml2/commit/?id=3f6cfbd1d38d0634a2ddcb9a0a13e1b5a2195a5e y construir manualmente, o tirar de la parte superior del árbol en vez de la versión 2.9.0, que construir, y luego decirle lxml usar esa acumulación.

En el futuro, si no quiere tener que lidiar con compilaciones de depuración, le sugiero que simplemente use pip para instalar paquetes de Python, y Homebrew para instalar las dependencias que faltan.Es posible que no siempre obtenga la versión ideal de la última versión de todo, pero será mucho más fácil y generalmente lo suficientemente bueno.

+0

¡Guau, muchas gracias por la respuesta increíblemente completa! Sé que traté de usar pip al principio, pero no funcionó; Lo intenté ahora y se completó con éxito. (Salida de terminal al final = "Ixml correctamente instalado") Pero cuando entro en python y escribo "import lxml" obtengo "ImportError: ningún módulo llamado lxml". ¿Alguna idea sobre lo que estoy haciendo mal? –

+1

¿Tiene alguna instalación que no sea de Apple Python? Es posible que esté ejecutando versiones de pip y python que no coinciden. Una cosa bastante común es que termina con/usr/local/bin/pip (o/opt/local/bin/pip, etc.) como primer pip en su ruta, e instala módulos para/usr/local/bin/python, pero luego/usr/bin/python como la primera python. – abarnert

+0

Es bastante posible que haya logrado arruinar eso en algún momento. ¿Cómo puedo diagnosticar esto? (¡Soy un verdadero principiante en los comandos/paths/protoclores de UNIX!) –

Cuestiones relacionadas