python3:ImportError:没有名为xxxx

时间:2015-12-25 10:22:27

标签: python package importerror

我是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。 PyDev在 init .py文件中报告了一个“Unresolved import:Pots”-error。 我在PyDev和bash下有相同的追溯问题。

同样,我是Python新手......所以这可能是一个非常愚蠢的错误。 但有人能解释一下,python2和python3.4之间的区别吗? 我是否必须修改PYTHONPATH?为什么呢?

问候 尔根

1 个答案:

答案 0 :(得分:45)

TL; DR: Relative imports are gone。改为使用绝对导入。

使用:

from Phone.Pots import Pots

或:

from .Pots import Pots

问题出现是因为PotsPhone包的一部分:没有名为Pots的模块,其中有一个名为Phone.Pots的模块。

Python 2有一个名为relative imports的功能,即使技术上不正确,也可以编写import Pots

然而,相对导入是problems and confusion的来源:

  • 谁读取代码无法立即说明导入是否来自包。
  • 为什么模块名为Phone.Pots,但我可以使用import Pots?这是非常不一致的。
  • 如果子模块影响另一个模块的名称怎么办?

由于这些原因,相对导入已从Python 3中删除。

您可以使用__future__ import

删除Python 2中的相对导入
from __future__ import absolute_import