Проблема с использованием py2app с пакетом lxml - PullRequest
6 голосов
/ 15 мая 2009

Я пытаюсь использовать py2app для создания автономного приложения из некоторых скриптов Python. Python использует пакет 'lxml', и я обнаружил, что должен явно указать это в файле setup.py, который использует py2app. Однако получающаяся прикладная программа по-прежнему не будет работать на компьютерах, на которых не установлен lxml.

Мой Setup.py выглядит так:

from setuptools import setup

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

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

При запуске приложения выдается следующий вывод:

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

Символ '_xmlSchematronParse' взят из библиотеки с именем 'libxml2', от которой зависит 'lxml'. Версия, предустановленная с Mac OS X, недостаточно обновлена ​​для «lxml», поэтому мне пришлось установить версию 2.7.2 (в / usr / local). По какой-то причине py2app ссылается на версию в /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib. Когда я запускаю свое приложение как скрипт Python, правильная версия найдена. (Я только что проверил это, скрыв версию 2.7.2.)

Итак, мой вопрос: как я могу указать py2app, где искать библиотеки?

Ответы [ 4 ]

13 голосов
/ 20 мая 2009

Нашел это. В py2app есть опция «frameworks», позволяющая вам указывать рамки, а также dylibs. Мой файл setup.py теперь выглядит так:

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

и это исправлено.

Спасибо за предложения, которые привели меня сюда.

1 голос
/ 17 мая 2009

У меня нет опыта работы с комбинацией lxml и py2app, но у меня были проблемы с тем, что py2app не собирал модули, которые не были явно импортированы. Например, мне пришлось явно включить модули, которые импортируются через __import__(), например:

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

Может быть, это также поможет в вашем случае вставить явный from lxml import etree где-нибудь в вашем коде?

1 голос
/ 18 мая 2009

Я только что попробовал мое приложение (использует py2app и lxml с аналогичной настройкой) на другом Mac без установленных библиотек разработки, и оно работает, поэтому в вашей системе должно быть что-то не так. Я предполагаю, что py2app выбирает неправильную версию libxml2 (я вижу, она поставляется в комплекте с iPhone SDK, например, что, вероятно, не та версия, которую вы хотите).

Мой, как и весь набор инструментов python, поставляется из MacPorts, md5 сумма последней libxml2.2.dylib (которая заканчивается в моем .app) равна 863c7208b6c34f116a2925444933c22a в моей системе.

1 голос
/ 15 мая 2009

------------- Редактировать --------------
libxml2 является стандартным в Python-версии Python. Это не стандартно в Apple версии Python. Убедитесь, что py2app использует правильную версию Python, или установите libxml2 и libxslt на свой Mac.

...