开发者

py2app and xml.etree.ElementTree

开发者 https://www.devze.com 2022-12-19 07:37 出处:网络
I\'m trying to build an app that uses some xml data using Python\'s built-in xml.etree.ElementTree class. It works properly when I run from the command line, but when I build it, I get an error \"Impo

I'm trying to build an app that uses some xml data using Python's built-in xml.etree.ElementTree class. It works properly when I run from the command line, but when I build it, I get an error "ImportError: No module etree.ElementTree." I'm guessing this is because I'm not importing that module correctly, but I haven't been able to figure out how. When I use the "includes" or "packages" directive, py2app complains with the same error, and when I specifically specify the package_dir (/System/Library/...), it compiles, but still gives me the error. I've included a short example to illustrate the issue.

macxml.py

from xml.etree.ElementTree import ElementTree

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

This should print out "< Element Library at xxxxxx>" where Library is the root name.

setup.py

from setuptools import setup

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

What is th开发者_如何学编程e correct way to make the mac app utilize this library?

Python 2.6.4

Mac OS X 10.6.2

Edit: I also tried this on another mac (PPC 10.5.8) with Python 2.6.2 and achieved the same results.


After reinstalling and updating macholib, modulegraph, py2app, and setuptools to no avail, I did a little more digging and found the following error in the modulegraph module:

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

So I looked more into the load_tail and import_hook functions and found that for some reason it was importing the xml package correctly, but then went to an old install of _xmlplus to look for the etree subpackage (which of course it couldn't find). Removing the _xmlplus package eliminated the error and I was able to get the application to work with the following setup.py file:

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'])]
     )

The output shows up in the console.


Since the comment doesn't have good formating,

In find_modules.py I changed

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

To

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

And the xml import worked.


If you're using macports (or fink etc.) make sure that py2app is using the correct interpreter. You may have to install a new version to work with 2.6.x (on OS X 10.5, py2app uses 2.4.x).

If that doesn't work my steps for working through path problems are:

  1. Start up the python interpreter that your code (or py2app) uses (are you absolutely certain?? try which python)
  2. import sys; print sys.path

If step 2. gives you a path in /System/Library..someotherpythonversion your code is running in the wrong interpreter.

0

精彩评论

暂无评论...
验证码 换一张
取 消