我是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:I'm Pots Phone*
太棒了......但是,如果我这样做:
python3 Test2.py Traceback (most recent call last): File "Test2.py", line 2, infrom Phone import Pots File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in 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?为什么?
问候Juergen
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中删除了相对导入.
您可以使用__future__
导入来删除Python 2中的相对导入:
from __future__ import absolute_import