代码之家  ›  专栏  ›  技术社区  ›  Charles Anderson

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

  •  6
  • Charles Anderson  · 技术社区  · 17 年前

    我试图使用“py2app”从一些Python脚本生成一个独立的应用程序。Python使用“lxml”包,我发现我必须在“py2app”使用的setup.py文件中明确指定这一点。但是,生成的应用程序仍然无法在未安装“lxml”的计算机上运行。

    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 回复  |  直到 17 年前
        1
  •  14
  •   Charles Anderson    17 年前

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

    这就解决了。

    谢谢你的建议,让我来到这里。

        2
  •  1
  •   Jason Coon    17 年前

    -------------编辑--------------
    libxml2 和 libxslt

        3
  •  1
  •   Frank Niessink    17 年前

    我没有专门使用lxml和py2app组合的经验,但我遇到过py2app无法拾取未显式导入的模块的问题。例如,我必须明确地包含通过导入的模块 __import__()

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

    from lxml import etree

        4
  •  1
  •   Luper Rouch François Lagunas    17 年前

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