【问题标题】:Problem using py2app with the lxml package将 py2app 与 lxml 包一起使用时出现问题
【发布时间】:2010-10-26 11:50:09
【问题描述】:

我正在尝试使用“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 在哪里寻找库?

【问题讨论】:

  • 您在应用程序的 Contents/Frameworks 子目录中找到 libxml2.2.dylib 吗?

标签: python lxml py2app


【解决方案1】:

找到了。 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'])

这就解决了。

感谢引导我来到这里的建议。

【讨论】:

  • 在 Mac OS X 上,libxml 位于 /usr/lib/libxml2.2.dylib 以防有人想知道
  • @Patrick 即系统,如果您针对另一个发行版(例如 Homebrew)创建 py2app,从该发行版打包会更安全。
  • 非常感谢您回答自己的问题
【解决方案2】:

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

【讨论】:

  • libxml2 不是 python 包,而是共享库。
  • libxml2 不包含在 Apple 的 Python 发行版中。
【解决方案3】:

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

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

也许在你的代码中插入一个明确的from lxml import etree 也有帮助?

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 2011-03-15
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2023-04-07
      • 2020-06-17
      相关资源
      最近更新 更多