将py2app与lxml包一起使用时出现问题

时间:2009-05-15 12:52:38

标签: python lxml py2app

我正在尝试使用'py2app'从一些Python脚本生成一个独立的应用程序。 Python使用'lxml'包,我发现我必须在'py2app'使用的setup.py文件中明确指定它。但是,生成的应用程序仍然无法在未安装“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 个答案:

答案 0 :(得分:13)

找到它。 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 :(得分:1)

-------------编辑--------------
libxml2是Python的python.org版本的标准。它不是Apple的Python版本的标准。确保py2app使用正确版本的Python,或在Mac上安装libxml2libxslt

答案 2 :(得分:1)

我没有专门针对lxml和py2app组合的经验,但是我遇到了py2app没有拾取未明确导入的模块的问题。例如,我必须明确包含通过__import__()导入的模块,如下所示:

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

也许在你的情况下,在代码中的某处插入一个明确的from lxml import etree也有帮助吗?

答案 3 :(得分:1)

我刚刚在没有安装开发库的另一台Mac上尝试了我的应用程序(使用py2app和lxml,具有类似的设置),并且它可以工作,因此系统中一定有问题。我的猜测是py2app选择了错误版本的libxml2(我看到它与iPhone SDK捆绑在一起,可能不是你想要的版本)。

我的整个python工具链来自MacPorts,最新的libxml2.2.dylib(最终在我的.app中)的md5总和是我系统上的863c7208b6c34f116a2925444933c22a。