Python3:导入错误:没有名为xxxx的模块。

45

我是Python的新手,正在尝试理解一个问题,当我创建一个包时,我遇到了这个问题。 我有以下文件结构:(工作目录为/ 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'

我正在使用Eclipse下的PyDev。在init.py文件中,PyDev报告了一个"无法解析导入:Pots"的错误。 在PyDev和bash下,我遇到了相同的回溯问题。

再次说明,我是Python的新手...所以这可能是一个非常愚蠢的错误。 但是,有人能解释一下Python2和Python3.4之间的区别吗? 我需要修改PYTHONPATH吗?为什么?

问候 Juergen

1个回答

64

TL;DR: 相对导入已被移除。请使用绝对导入。

可以使用以下方式:

from Phone.Pots import Pots

或者:

from .Pots import Pots

问题出在PotsPhone包的一部分:没有名为Pots的模块,而是一个名为Phone.Pots的模块。

Python 2有一个叫做相对导入的特性,它允许你编写import Pots,即使这在技术上是不正确的。

然而,相对导入是问题和困惑的来源:

  • 阅读代码的人无法立即判断导入是来自包还是其他地方。
  • 为什么模块命名为Phone.Pots,但我可以使用import Pots?这是非常不一致的。
  • 如果子模块遮蔽了另一个模块的名称会怎样?

因此,在Python 3中移除了相对导入。


你可以使用 __future__ 导入 来消除 Python 2 中的相对导入:
from __future__ import absolute_import

Andrea:感谢您快速而详细的回答。 - MatrixClient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接