【问题标题】:Chain imports work in Python 2 but fail in Python 3 [duplicate]链导入在 Python 2 中有效,但在 Python 3 中失败 [重复]
【发布时间】:2017-05-18 20:39:33
【问题描述】:

我有一个项目,其文件夹结构和文件内容如下:

├── 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'

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

在 Python 2 和 Python 3 中链式导入的不同行为背后的原理是什么,我怎样才能在代码或项目结构的最小更改的情况下克服这些差异?

【问题讨论】:

    标签: python python-2.7 python-3.x python-import


    【解决方案1】:

    你使用

    from __future__ import absolute_import
    

    然后您只需在两者中都使用 Python 3 方式:您的 moduleB 可以使用任何一个

    from mylib import moduleA
    

    from . import moduleA  # Relative to directory of this module
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我通过添加点并再次运行 scriptB.py 得到了Parent module '' not loaded, cannot perform relative import。我做错了什么?
      • 很抱歉,您需要在moduleB.py 中使用from . import moduleA
      • 是的,它不起作用。您能否更正您的答案,以便我可以接受它而不会进一步混淆?
      • 完成。但最好接受 RemcoGerlich 的回答,因为它还包含对 __future__ 的引用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多