提问人:Charles Anderson 提问时间:5/15/2009 最后编辑:Charles Anderson 更新时间:5/20/2009 访问量:2157
将 py2app 与 lxml 包一起使用时出现问题
Problem using py2app with the lxml package
问:
我正在尝试使用“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在哪里寻找库?
答:
------------- Edit--------------
是 Python python.org 版本中的标准配置。它不是 Apple 版本的 Python 中的标准。确保 py2app 使用的是正确版本的 Python,或者在 Mac 上安装和安装。libxml2
libxml2
libxslt
评论
我没有专门使用 lxml 和 py2app 组合的经验,但是我遇到了 py2app 无法选取未显式导入的模块的问题。例如,我必须显式包含通过 导入的模块,如下所示:__import__()
OPTIONS['includes'] = [filename[:-3].replace('/', '.') for filename \
in glob.glob('path/to/*.py')]
也许在您的情况下,在代码中的某处插入显式内容也会有所帮助?from lxml import etree
我刚刚在另一台没有安装开发库的 Mac 上尝试了我的应用程序(使用 py2app 和 lxml,具有类似的设置),并且它可以工作,所以您的系统中一定有问题。我的猜测是 py2app 选择了错误的 libxml2 版本(例如,我看到它与 iPhone SDK 捆绑在一起,这可能不是您想要的版本)。
我的,作为整个 python 工具链,来自 MacPorts,最新的 libxml2.2.dylib(最终出现在我.app中的那个)的 md5 总和是 863c7208b6c34f116a2925444933c22a在我的系统上。
找到了。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'])
这已经解决了。
感谢您的建议将我带到这里。
评论
/usr/lib/libxml2.2.dylib
py2app
评论