Модуль импорта работает на интерпретаторе, но не на сценарии - PullRequest
3 голосов
/ 28 мая 2011

Я начинал следовать учебному пособию по elementtree на этом сайте http://www.bigfatalien.com/?p=223, поэтому, как обычно, я набрал справочные скрипты на интерпретаторе, и я пошел

import xml.etree.ElementTree as xml

И интерпретатор запустил эту командупросто отлично и с использованием «xml» в intrepreter без проблем, моя IDE даже показала членов этого класса на автозаполнении, но как только я набрал ту же самую строку в скрипте и попытался запустить его, он говорит:

объект не имеет атрибута 'etree'

, эта строка работает:

import xml

Но если я добавлю:

xml.etree.ElementTree = xml

Ипопробуйте запустить этот скрипт, который не работает, я попытался с моей IDE (pyscripter) и с IDLE, то же самое поведение.Что происходит здесь, каково это поведение, я никогда не читал упомянутое в любом из учебников или книг «Как импортировать в Python».Я чувствую, что упускаю что-то очевидное.

Обновление с запрошенными сообщениями об ошибках

Запустил предоставленные строки из IDLE 2.6

2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]
[u'C:\\Users\\grillermo\\Desktop', 'C:\\Program Files\\PyScripter\\Lib\\rpyc-python2x.zip', 'C:\\Python26\\lib\\site-packages\\dropbox_client-1.0-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\simplejson-2.1.6-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\poster-0.8.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\oauth-1.0.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\nose-1.0.0-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\mechanize-0.2.5-py2.6.egg', 'C:\\Windows\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32', 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-packages\\Pythonwin', 'C:\\Python26\\lib\\site-packages\\wx-2.8-msw-unicode']
2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]
[u'C:\\Users\\grillermo\\Desktop', 'C:\\Program Files\\PyScripter\\Lib\\rpyc-python2x.zip', 'C:\\Python26\\lib\\site-packages\\dropbox_client-1.0-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\simplejson-2.1.6-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\poster-0.8.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\oauth-1.0.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\nose-1.0.0-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\mechanize-0.2.5-py2.6.egg', 'C:\\Windows\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32', 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-packages\\Pythonwin', 'C:\\Python26\\lib\\site-packages\\wx-2.8-msw-unicode']
Traceback (most recent call last):
  File "C:\Users\grillermo\Desktop\xml.py", line 4, in <module>
    import xml.etree.ElementTree as et
  File "C:\Users\grillermo\Desktop\xml.py", line 4, in <module>
    import xml.etree.ElementTree as et
ImportError: No module named etree.ElementTree

Интерпретатор

C:\>python
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import xml.etree.ElementTree as et
>>> print et.__file__
C:\Python26\lib\xml\etree\ElementTree.pyc
>>>

Ответы [ 2 ]

13 голосов
/ 28 мая 2011

Действительно глупый вопрос: вы назвали свой файл сценария xml.py?Если это так, НЕ ДЕЛАЙТЕ ЭТОГО ... import xml.anything будет искать в вашем файле скрипта!Никогда не рекомендуется назначать файлу сценария то же имя, что и модуль, который вы собираетесь импортировать.

Обновление Отслеживание ваших друзей.Ведите, чтобы прочитать их внимательно.Если вы не знаете, как их читать, включите трассировку в ваш вопрос .

Могу поспорить, что ваш будет выглядеть примерно так:

Traceback (most recent call last):
  File "xml.py", line 4, in <module>
    import xml.etree.ElementTree as et
  File "C:\junk\xml.py", line 4, in <module> #### here's the culprit ####
    import xml.etree.ElementTree as et
ImportError: No module named etree.ElementTree

В противном случае:

Настройте скрипт, содержащий только следующие строки:

import sys
print sys.version
print sys.path
import xml.etree.ElementTree as et
print et.__file__
import xml.etree.ElementTree as xml
print xml.__file__

запустите его и покажите все выходные данные ... скопируйте / вставьте в редактирование вашего вопроса.

Повторите следующую сессию переводчика на своем компьютере и сообщите, что напечатано:

C:\junk>\python26\python
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import xml.etree.ElementTree as et
>>> print et.__file__
C:\python26\lib\xml\etree\ElementTree.pyc
>>>
1 голос
/ 28 мая 2011

Когда вы делаете:

import xml.etree.ElementTree as xml

вы вводите xml.etree.ElementTree «объект» и называете его xml.

Похоже, что это не так во второй версии. При этом вы импортируете xml как xml, а затем назначаете неправильный путь:

xml.etree.ElementTree = xml

Это, кажется, заменяет объект ElementTree ссылкой на верхний уровень xml, вероятно, не то, что вы хотели. Я хотел бы сказать, что:

xml = xml.etree.ElementTree

было бы более точным способом, но я не уверен, вызовет ли это проблемы с именами.

В любом случае, я не вижу, что на самом деле не так с вашей import xml.etree.ElementTree as xml версией. Похоже, она делает именно то, что вы хотите (и прекрасно работает в скриптах для меня).

...