python3:ImportError:没有名为xxxx的模块[重复]

Posted

技术标签:

【中文标题】python3:ImportError:没有名为xxxx的模块[重复]【英文标题】:python3: ImportError: No module named xxxx [duplicate] 【发布时间】:2016-03-31 10:35:42 【问题描述】:

我是 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 文件中向我报告“未解决的导入:Pots”错误。 我在 PyDev 和 bash 下也有同样的回溯问题。

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

问候 于尔根

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于python3:ImportError:没有名为xxxx的模块[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python3.7 ImportError:没有名为“django”的模块

ImportError:没有名为“cv2”Python3 的模块

python3:ImportError:没有名为xxxx的模块[重复]

ImportError:没有名为'bs4'的模块与virtualenv python3

ImportError:没有名为“spm1d”的模块

x11 - ImportError:没有名为“kivy.core.window.window_x11”的模块