2009-05-15 15 views
5

Ich versuche, ‚py2app‘ zu verwenden, um eine eigenständige Anwendung von einigem Python-Skripte zu generieren. Der Python verwendet das Paket 'lxml', und ich habe festgestellt, dass ich dies explizit in der Datei setup.py angeben muss, die 'py2app' verwendet. Das resultierende Anwendungsprogramm wird jedoch weiterhin nicht auf Computern ausgeführt, auf denen 'Lxml' nicht installiert ist.Problem mit py2app mit dem lxml Paket

Mein Setup.py sieht wie folgt aus:

from setuptools import setup 

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

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

Ausführen der Anwendung erzeugt die folgende Ausgabe:

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 

Das Symbol '_xmlSchematronParse' ist aus einer Bibliothek 'libxml2' genannt, dass ‚lxml ' kommt drauf an. Die Version, die mit Mac OS X vorinstalliert ist, ist nicht aktuell genug für 'lxml', also musste ich Version 2.7.2 (in/usr/local) installieren. py2app verlinkt aus irgendeinem Grund in der Version in /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib. Wenn ich meine Anwendung jedoch als Python-Skript ausführe, wird die richtige Version gefunden. (Ich habe das jetzt nur durch die 2.7.2 Version versteckt.)

So jetzt meine Frage ist, wie kann ich sagen py2app wo für Bibliotheken suchen?

+1

Sie finden Sie im Inhaltsverzeichnis/Frameworks subdir Ihrer App libxml2.2.dylib? –

+0

Ja, es ist da. –

Antwort

10

Es gefunden. py2app hat eine 'frameworks' Option, mit der Sie Frameworks und auch dylibs angeben können. Meine setup.py Datei sieht jetzt so aus:

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']) 

und das ist es behoben.

Danke für die Vorschläge, die mich hierher geführt.

+1

Unter Mac OS X befindet sich libxml in '/usr/lib/libxml2.2.dylib' incase jemand wundert sich – Patrick

+0

@Patrick das ist System, wenn Sie 'py2app' gegen eine andere Verteilung (z. B. Homebrew) erstellen, ist es sicherer, von dieser Verteilung zu verpacken. – dashesy

1

------------- -------------- bearbeiten
libxml2 ist in der python.org Version von Python-Standard. Es ist nicht Standard in der Apple-Version von Python. Stellen Sie sicher, dass py2app die richtige Version von Python verwendet, oder installieren Sie libxml2 und libxslt auf Ihrem Mac.

+1

libxml2 ist kein Python-Paket, sondern eine gemeinsam genutzte Bibliothek. –

+0

libxml2 ist nicht in Apples Python-Distribution enthalten. –

+0

Ich habe es versucht, aber, wie Luper darauf hinweist, es ist kein Paket. –

1

Ich habe keine Erfahrung mit der Kombination von lxml und py2app speziell, aber ich habe Probleme hat mit py2app nicht Modulen Abholung, die nicht explizit importiert wurde. Zum Beispiel hatte ich ausdrücklich enthalten Module, die über __import__(), wie diese importiert werden:

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

Vielleicht in Ihrem Fall hilft es auch, eine explizites from lxml import etree irgendwo in Ihrem Code einfügen?

1

Ich habe gerade versucht, meine app (verwendet py2app und lxml, mit einem ähnlichen Setup) auf einem anderen Mac ohne installierte Entwicklungsbibliotheken, und es funktioniert, so muss es etwas falsch in Ihrem System. Meine Vermutung ist, dass py2app die falsche Version von libxml2 auswählt (ich sehe, dass sie zum Beispiel mit dem iPhone SDK ausgeliefert wird, was wahrscheinlich nicht die von Ihnen gewünschte Version ist).

Mine, wie die gesamte Python Toolchain, kommt von MacPorts, MD5 Summe der neuesten libxml2.2.dylib (die, die in meiner .app endet) ist 863c7208b6c34f116a2925444933c22a auf meinem System.