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? Почему?
Привет
Юрген
Ответы
Ответ 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