py2app и xml.etree.ElementTree

Я пытаюсь создать приложение, которое использует некоторые данные xml, используя встроенный в Python класс xml.etree.ElementTree. Он работает правильно, когда я запускаю из командной строки, но когда я его собираю, я получаю сообщение об ошибке «ImportError: No module etree.ElementTree». Я предполагаю, что это потому, что я неправильно импортирую этот модуль, но я не смог понять, как это сделать. Когда я использую директиву «включает» или «пакеты», py2app жалуется на ту же ошибку, и когда я специально указываю package_dir (/System/Library/...), он компилируется, но все равно выдает ошибку. Я включил короткий пример, чтобы проиллюстрировать проблему.

macxml.py

from xml.etree.ElementTree import ElementTree

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

Это должно распечатать «‹ Библиотека элементов в xxxxxx>», где библиотека — это корневое имя.

setup.py

from setuptools import setup

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

Как правильно заставить приложение Mac использовать эту библиотеку?

Питон 2.6.4

Mac OS X 10.6.2

Изменить: я также попробовал это на другом Mac (PPC 10.5.8) с Python 2.6.2 и добился тех же результатов.


person jeffaudio    schedule 01.02.2010    source источник


Ответы (3)


После переустановки и обновления 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_tail и import_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'])]
     )

Вывод отображается в консоли.

person jeffaudio    schedule 02.02.2010
comment
Предполагая, что мы сделали то же самое, это сработало и для меня. Поскольку следующее не очень хорошо форматируется, я добавил его в комментарии ниже. Я отредактировал find_modules.py и заменил REPLACEPACKAGES = { '_xmlplus': 'xml', } на REPLACEPACKAGES = { #'_xmlplus': 'xml', } - person Steven; 07.01.2011

Поскольку комментарий не имеет хорошего форматирования,

В find_modules.py я изменил

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

To

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

И импорт xml работал.

person Steven    schedule 07.01.2011
comment
Теперь это исправлено в последней версии modulegraph @0.8.2. - person Steven; 10.01.2011

Если вы используете macports (или fink и т. д.), убедитесь, что py2app использует правильный интерпретатор. Возможно, вам придется установить новую версию для работы с 2.6.x (в OS X 10.5 py2app использует 2.4.x).

Если это не сработает, мои шаги для решения проблем с путями:

  1. Запустите интерпретатор Python, который использует ваш код (или py2app) (вы абсолютно уверены?? попробуйте which python)
  2. import sys; print sys.path

Если шаг 2. дает вам путь в /System/Library..someotherpythonversion, ваш код работает в неправильном интерпретаторе.

person Dana the Sane    schedule 01.02.2010
comment
Я использую стандартную установку 2.6.4 с python.org. Код, похоже, запускается из правильного интерпретатора. И which python, и sys.path указывают на /Library/Frameworks/Python.framework/Versions/2.6/. - person jeffaudio; 01.02.2010
comment
Должно быть какое-то странное поведение с py2app тогда, как вы это установили? Вы пытались запустить скрипт через py2app, который печатает путь? - person Dana the Sane; 02.02.2010
comment
Вы говорите, когда я специально указываю package_dir (/System/Library/...). Если вы используете python.org версии 2.6.4, не должно быть путей /System/Library/Framework/Python.... Вы установили отдельную версию setuptools или Distribute для python python.org и используете ли вы этот скрипт easy_install (в каталоге /Library/Frameworks.../bin) вместо поставляемого Apple easy_install в /usr/bin ( который устанавливает пакеты на питон, поставляемый Apple)? - person Ned Deily; 02.02.2010
comment
Я не помню, как я установил py2app, но python показывает, что он находится по адресу /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/py2app-0.4.2-py2.6.egg. Кроме того, версия Python, которую я использую, представляет собой файл dmg для Mac OS X с сайта python.org (поскольку у моего Mac была только 2.6.3), но я заметил, что когда я открываю его, он говорит Python 2.6.4 (r264: 75821M, 27 октября 2009 г., 19:48:23) [GCC 4.0.1 (Apple Inc., сборка 5493)] на Darwin. setuptools показывает, что я использую v0.6c9-py2.6.egg. Я попробую переустановить p2yapp, хотя я не могу использовать easy_install из моего текущего местоположения из-за прокси-сервера. - person jeffaudio; 02.02.2010