2009-05-15 13 views
5

Estoy tratando de usar 'py2app' para generar una aplicación independiente desde algunos scripts de Python. Python usa el paquete 'lxml', y he descubierto que debo especificarlo explícitamente en el archivo setup.py que usa 'py2app'. Sin embargo, el programa de aplicación resultante aún no se ejecutará en máquinas que no tengan instalado 'lxml'.Problema al usar py2app con el paquete lxml

Mi Setup.py se ve así:

from setuptools import setup 

OPTIONS = {'argv_emulation': True, 'packages' : ['lxml']} 

setup(app=[MyApp.py], 
     data_files=[], 
     options={'py2app' : OPTIONS}, 
     setup_requires=['py2app']) 

Ejecución de la aplicación produce el siguiente resultado:

MyApp Error 
An unexpected error has occurred during execution of the main script 
ImportError: dlopen(/Users/ake/XXXX/XXXX/MyApp.app/Contents/Resources/lib/python2.5/lxml/etree.so, 2): Symbol not found: _xmlSchematronParse 
Referenced from: /Users/ake/XXXX/XXXX/MyApp.app/Contents/Resources/lib/python2.5/lxml/etree.so 
Expected in: dynamic lookup 

El símbolo '_xmlSchematronParse' es de una biblioteca llamada '' que libxml2 'lxml ' depende de. La versión que viene preinstalada con Mac OS X no está suficientemente actualizada para 'lxml', así que tuve que instalar la versión 2.7.2 (en/usr/local). py2app, por alguna razón, está enlazando en la versión en/Desarrollador/SDKs/MacSX10.3.9.sdk/usr/lib. Sin embargo, cuando ejecuto mi aplicación como un script de Python, se encuentra la versión correcta. (Lo comprobé hace un momento al ocultar la versión 2.7.2.)

Así que mi pregunta ahora es, ¿cómo puedo decirle a py2app dónde buscar las bibliotecas?

+1

¿Encuentra libxml2.2.dylib en el subdirectorio Contents/Frameworks de su aplicación? –

+0

Sí, está allí. –

Respuesta

10

Lo encontró. py2app tiene una opción 'frameworks' que le permite especificar frameworks, y también dylibs. Mi archivo setup.py ahora se ve así:

from setuptools import setup 

DATA_FILES = [] 
OPTIONS = {'argv_emulation': True, 
      'packages' : ['lxml'], 
      'frameworks' : ['/usr/local/libxml2-2.7.2/lib/libxml2.2.7.2.dylib'] 
      } 

setup(app=MyApp.py, 
     data_files=DATA_FILES, 
     options={'py2app' : OPTIONS}, 
     setup_requires=['py2app']) 

y eso lo solucionó.

Gracias por las sugerencias que me llevaron aquí.

+1

En Mac OS X, libxml se encuentra en '/usr/lib/libxml2.2.dylib' en caso de que alguien se pregunte – Patrick

+0

@Patrick que es un sistema, si crea 'py2app' contra otra distribución (por ejemplo, Homebrew), es más seguro empacar desde esa distribución. – dashesy

1

------------- -------------- Editar
libxml2 es estándar en la versión python.org de Python. No es estándar en la versión de Apple de Python. Asegúrese de que py2app esté utilizando la versión correcta de Python o instale libxml2 y libxslt en su Mac.

+1

libxml2 no es un paquete de Python sino una biblioteca compartida. –

+0

libxml2 no está incluido en la distribución Python de Apple. –

+0

Lo intenté pero, como señala Luper, no es un paquete. –

1

No tengo ninguna experiencia con la combinación de lxml y py2app específicamente, pero he tenido problemas con py2app al no recoger los módulos que no se importaron explícitamente. Por ejemplo, he tenido que incluir explícitamente los módulos que se importan a través de __import__(), así:

OPTIONS['includes'] = [filename[:-3].replace('/', '.') for filename \ 
    in glob.glob('path/to/*.py')] 

Tal vez también ayuda en su caso para insertar una explícita from lxml import etree en algún lugar de su código?

1

Acabo de probar mi aplicación (utiliza py2app y lxml, con una configuración similar) en otra Mac sin bibliotecas de desarrollo instaladas, y funciona, por lo que debe haber algo mal en su sistema. Supongo que py2app elige la versión incorrecta de libxml2 (veo que viene incluida con el iPhone SDK, por ejemplo, que probablemente no sea la versión que desea).

El mío, como todo el conjunto de herramientas de python, viene de MacPorts, md5 suma de la última libxml2.2.dylib (la que termina en mi .app) es 863c7208b6c34f116a2925444933c22a en mi sistema.

Cuestiones relacionadas