Проблема с использованием py2app с пакетом lxml

Я пытаюсь использовать «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, где искать библиотеки?


person Charles Anderson    schedule 15.05.2009    source источник
comment
Находите ли вы libxml2.2.dylib в подкаталоге Contents/Frameworks вашего приложения?   -  person Luper Rouch    schedule 15.05.2009


Ответы (4)


Нашел. 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'])

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

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

person Charles Anderson    schedule 20.05.2009
comment
В Mac OS X libxml находится в /usr/lib/libxml2.2.dylib, если кому-то интересно - person Patrick; 23.09.2013
comment
@Patrick, это система, если вы создаете py2app для другого дистрибутива (например, Homebrew), безопаснее упаковывать из этого дистрибутива. - person dashesy; 27.09.2015
comment
Большое спасибо за ответ на свой вопрос ‹3 - person Tim Strijdhorst; 15.03.2018

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

person Jason Coon    schedule 15.05.2009
comment
libxml2 — это не пакет Python, а общая библиотека. - person Luper Rouch; 15.05.2009
comment
libxml2 не входит в дистрибутив Apple Python. - person Jason Coon; 15.05.2009

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

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

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

person Frank Niessink    schedule 17.05.2009

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

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

person Luper Rouch    schedule 18.05.2009