Подтвердить что ты не робот

Python3: ImportError: нет модуля с именем xxxx

Я новичок в Python, и я пытаюсь понять проблему, которую я вижу при создании пакета. У меня есть следующая файловая структура: (Working-Directory is/my/Python/jmLib2)

/my/Python/jmLib2
     |--- Phone
     |      |--- __init__.py
     |      |--- Pots.py
     |- Test2.py

---------------------------------
cat ./jmLib2/Pots.py
#!/usr/bin/python

def Pots():
    print ("I'm Pots Phone")

---------------------------------
cat ./jmLib2/__init__.py
from Pots import Pots

---------------------------------
cat ./Test2.py
#!/usr/bin/python
from Phone import Pots

import os.path
print ("OS:"+str(os.path))

Pots()

Когда я сейчас:

python2 Test2.py
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'>
    I'm Pots Phone*

БОЛЬШОЙ... НО, если я это сделаю:

python3 Test2.py
Traceback (most recent call last):
  File "Test2.py", line 2, in <module>
    from Phone import Pots
  File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module>
    from Pots import Pots
ImportError: No module named 'Pots'

Я работаю с PyDev под Eclipse. PyDev сообщает мне в init.py файле "Unresolved import: Pots" -error. У меня такая же проблема трассировки в PyDev и bash.

Опять же, я новичок в Python... так что, возможно, это очень глупая ошибка. Но может кто-нибудь объяснить мне, разница между python2 и python3.4? Нужно ли мне модифицировать PYTHONPATH? Почему?

Привет Юрген

4b9b3361

Ответ 1

TL; DR: Относительный импорт отсутствует. Вместо этого используйте абсолютный импорт.

Либо используйте:

from Phone.Pots import Pots

или

from .Pots import Pots

Проблема возникает из-за того, что Pots является частью пакета Phone: нет модуля с именем Pots, там есть модуль с именем Phone.Pots.

У Python 2 была функция, называемая относительный импорт, которая позволяет писать import Pots, даже если это не было технически правильно.

Относительный импорт, однако, является источником проблем и путаницы:

  • Кто читает код, не может сразу сказать, является ли импорт из пакета или нет.
  • Почему модуль называется Phone.Pots, но я могу использовать import Pots? Это очень противоречиво.
  • Что делать, если подмодуль затеняет имя другого модуля?

По этим причинам относительный импорт был удален из Python 3.


Вы можете избавиться от относительного импорта из Python 2 с помощью __future__ import:

from __future__ import absolute_import