链导入在 Python 2 中工作但在 Python 3 中失败

Chain imports work in Python 2 but fail in Python 3

我有一个具有以下文件夹结构和文件内容的项目:

├── code
│   ├── my_lib
│   │   ├── __init__.py
│   │   ├── moduleA.py
│   │   └── moduleB.py
│   ├── scriptA.py
│   └── scriptB.py

__init__.py

#empty 

moduleA.py

def funA():
    print("A")

moduleB.py

import moduleA

moduleA.funA()

def funB():
    print("B")

scriptA.py

from my_lib import moduleA

moduleA.funA()

scriptB.py

from my_lib import moduleB

moduleB.funB()

在Python 2.7 中,我可以成功运行 所有四个Python 文件。但是使用 Python 3.5,我不能 运行 scriptB.py,因为它给了我以下错误:

Traceback (most recent call last):
  File "scriptB.py", line 1, in <module>
    from my_lib import moduleB
  File "/home/marjan/Desktop/code/my_lib/moduleB.py", line 1, in <module>
    import moduleA
ImportError: No module named 'moduleA'

如果我 运行 moduleB.py(显然是导致问题的那个)单独使用 Python 3,它 运行 没有问题。

Python 2 与 Python 3 中链式导入的不同行为背后的原理是什么,我如何通过对代码或项目结构进行最小更改来克服这些差异?

您使用

from __future__ import absolute_import

然后您只需在两者中使用 Python 3 方式:您的模块 B 可以使用任一

from mylib import moduleA

from . import moduleA  # Relative to directory of this module

但导入不再是隐式相对的。

您需要在 moduleB.py 中使用 from . import moduleApython3 进行相对导入。否则它被认为是绝对导入。