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

Problem using py2app with the lxml package

提问人:Charles Anderson 提问时间:5/15/2009 最后编辑:Charles Anderson 更新时间:5/20/2009 访问量:2157

问:

我正在尝试使用“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”来自“lxml”所依赖的名为“libxml2”的库。Mac OS X 预装的版本对于“lxml”来说还不够新,所以我不得不安装 2.7.2 版(在 /usr/local 中)。出于某种原因,py2app 正在链接 /Developer/SDKs/MacOSX10.3.9.sdk/usr/lib 中的版本。但是,当我将应用程序作为 Python 脚本运行时,找到了正确的版本。(我刚才通过隐藏 2.7.2 版本来检查这一点。

所以我现在的问题是,我怎样才能告诉py2app在哪里寻找库?

lxml py2app的

评论

1赞 Luper Rouch 5/15/2009
您是否在应用程序的 Contents/Frameworks 子目录中找到 libxml2.2.dylib?

答:

1赞 Jason Coon 5/15/2009 #1

------------- Edit--------------
是 Python python.org 版本中的标准配置。它不是 Apple 版本的 Python 中的标准。确保 py2app 使用的是正确版本的 Python,或者在 Mac 上安装和安装。
libxml2libxml2libxslt

评论

1赞 Luper Rouch 5/15/2009
libxml2 不是一个 python 包,而是一个共享库。
0赞 Jason Coon 5/15/2009
libxml2 不包含在 Apple 的 Python 发行版中。
1赞 Frank Niessink 5/18/2009 #2

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

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

也许在您的情况下,在代码中的某处插入显式内容也会有所帮助?from lxml import etree

1赞 Luper Rouch 5/18/2009 #3

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

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

14赞 Charles Anderson 5/20/2009 #4

找到了。py2app 有一个“框架”选项,可让您指定框架和 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赞 Patrick 9/23/2013
在 Mac OS X 上,libxml 位于以防有人想知道的情况下/usr/lib/libxml2.2.dylib
0赞 dashesy 9/28/2015
@Patrick系统,如果你针对另一个发行版(例如Homebrew)创建,那么从该发行版打包会更安全。py2app
0赞 Tim Strijdhorst 3/15/2018
非常感谢您回答自己的问题 <3