链导入在 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 moduleA
和 python3
进行相对导入。否则它被认为是绝对导入。
我有一个具有以下文件夹结构和文件内容的项目:
├── 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 moduleA
和 python3
进行相对导入。否则它被认为是绝对导入。