6

我正在尝试使用“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

4 回答 4

14

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

这样就解决了。

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

于 2009-05-20T15:15:54.853 回答
1

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

于 2009-05-15T13:01:48.933 回答
1

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

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

from lxml import etree在您的情况下,在您的代码中的某处插入显式可能也有帮助?

于 2009-05-17T16:24:43.993 回答
1

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

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

于 2009-05-18T12:46:32.447 回答