Проблема с использованием 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, где искать библиотеки?

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам