【问题标题】:py2app and xml.etree.ElementTreepy2app 和 xml.etree.ElementTree
【发布时间】:2011-01-08 00:57:56
【问题描述】:

我正在尝试使用 Python 的内置 xml.etree.ElementTree 类构建一个使用一些 xml 数据的应用程序。当我从命令行运行时它可以正常工作,但是当我构建它时,我得到一个错误“ImportError: No module etree.ElementTree”。我猜这是因为我没有正确导入该模块,但我无法弄清楚如何。当我使用“includes”或“packages”指令时,py2app 会抱怨同样的错误,当我专门指定 package_dir (/System/Library/...) 时,它会编译,但仍然给我错误。我提供了一个简短的例子来说明这个问题。

macxml.py

from xml.etree.ElementTree import ElementTree

if __name__ == '__main__':
    tree = ElementTree()
    print tree.parse('lib.xml')

这应该打印出“”,其中 Library 是根名称。

setup.py

from setuptools import setup

setup(name="Mac XML Test",
      app=['macxml.py'],
     )

让 mac 应用使用这个库的正确方法是什么?

Python 2.6.4

Mac OS X 10.6.2

编辑:我也在另一台 Mac (PPC 10.5.8) 上使用 Python 2.6.2 进行了尝试,并取得了相同的结果。

【问题讨论】:

    标签: python xml py2app


    【解决方案1】:

    重装更新macholib、modulegraph、py2app、setuptools无济于事后,我又挖了一点,发现modulegraph模块报如下错误:

    graphmodule.find_modules.find_modules(includes=['xml.etree'])
    Traceback (most recent call last):
        File "<stdin>", line 1 in <module>
        File ".../modulegraph/find_modules.py", line 255 in find_modules
        File ".../modulegraph/find_modules.py", line 182 in find_needed_modules
        File ".../modulegraph/modulegraph.py", line 401 in import_hook
        File ".../modulegraph/modulegraph.py", line 464 in load_tail
    ImportError: No module named xml.etree
    

    所以我更多地查看了load_tailimport_hook 函数,发现由于某种原因它正确地导入了 xml 包,但随后又去旧安装的 _xmlplus 寻找 etree 子包(当然它找不到)。删除 _xmlplus 包消除了错误,我能够让应用程序使用以下 setup.py 文件:

    from setuptools import setup
    import xml.etree.ElementTree
    
    setup(name="Mac XML Test",
          app=['macxml.py'],
          options={'py2app': {'includes': ['xml.etree.ElementTree']}},
          data_files=[('', ['lib.xml'])]
         )
    

    输出显示在控制台中。

    【讨论】:

    • 假设我们做了同样的事情,这对我也有用。由于以下内容格式不正确,因此我在下面的评论中添加了它。我编辑了 find_modules.py 并将 REPLACEPACKAGES = { '_xmlplus': 'xml', } 更改为 REPLACEPACKAGES = { #'_xmlplus': 'xml', }
    【解决方案2】:

    由于评论的格式不好,

    在 find_modules.py 我改变了

    REPLACEPACKAGES = {
        '_xmlplus':     'xml',
    }
    

    REPLACEPACKAGES = {
        #'_xmlplus':     'xml',
    }
    

    xml 导入成功了。

    【讨论】:

    • 这已在最新的模块图 @0.8.2 中得到修复
    【解决方案3】:

    如果您使用的是 macports(或 fink 等),请确保 py2app 使用的是正确的解释器。您可能需要安装新版本才能使用 2.6.x(在 OS X 10.5 上,py2app 使用 2.4.x)。

    如果这不起作用,我解决路径问题的步骤是:

    1. 启动你的代码(或py2app)使用的python解释器(你确定吗??试试which python
    2. import sys; print sys.path

    如果步骤 2. 为您提供/System/Library..someotherpythonversion 中的路径,则您的代码在错误的解释器中运行。

    【讨论】:

    • 我正在使用来自 python.org 的标准 2.6.4 安装。代码似乎是从正确的解释器运行的。 which python 和 sys.path 都指向 /Library/Frameworks/Python.framework/Versions/2.6/
    • py2app 一定有一些奇怪的行为,那么你是如何安装的?您是否尝试过通过py2app 运行脚本来打印路径?
    • 您说“当我专门指定 package_dir (/System/Library/...) 时”。如果您使用的是 2.6.4 python.org,则不应有任何 /System/Library/Framework/Python... 路径。您是否为 python.org python 安装了单独版本的 setuptools 或 Distribute 并且您使用的是 easy_install 脚本(在 /Library/Frameworks.../bin 目录中)而不是 Apple 在 /usr/ 中提供的 easy_install bin(将软件包安装到 Apple 提供的 python)?
    • 我不记得我是如何安装 py2app 的,但 python 显示它位于 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/py2app-0.4.2-py2.6.egg。另外,我使用的 python 版本是来自 python.org 的 Mac OS X dmg 文件(因为我的 mac 只有 2.6.3),但我注意到当我打开它时它显示“Python 2.6.4 (r264:75821M , Oct 27, 2009, 19:48:23) [GCC 4.0.1 (Apple Inc. build 5493)] on darwin. setuptools 显示我正在使用 v0.6c9-py2.6.egg。我将尝试重新安装 p2yapp,虽然我不能从代理的当前位置 b/c 使用 easy_install。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2016-09-07
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多