如何在Python 3中使用绝对导入来导入位于其父目录中的包?

zak*_*ako 5 python python-3.x

我有一个像这样的 python 包目录:

proj/
  mod_a/
    __init__.py
    x.py
    submod_x/
      __init__.py
      y.py
  mod_b/
    __init__.py
    z.py
Run Code Online (Sandbox Code Playgroud)

与 x.py:

import submod_x.y
Run Code Online (Sandbox Code Playgroud)

z.py:

import sys, os.path
sys.path.append(os.path.abspath('../'))

import mod_a.x
Run Code Online (Sandbox Code Playgroud)

现在当我跑步时:

$ python2 z.py
Run Code Online (Sandbox Code Playgroud)

我用 y.py 编码完成了事情

但是当我跑步时:

$ python3 z.py
Run Code Online (Sandbox Code Playgroud)

我有一个例外:

Traceback (most recent call last):
File "z.py", line 4, in <module>
  import mod_a.x
File ".../proj/mod_a/x.py", line 1, in <module>
  import submod_x.y
ImportError: No module named 'submod_x'
Run Code Online (Sandbox Code Playgroud)

我想知道Python 2和Python 3在导入包时有什么区别,以及如何在Python 3中使用绝对导入来导入位于其父目录中的包?

Use*_*ser 0

我认为你应该在 x.py 中执行此操作:

import mod_a.submod_x.y
Run Code Online (Sandbox Code Playgroud)

从文件位置的绝对导入是使用绝对模块名称或如下所示完成的:

from . import submod_x.y
Run Code Online (Sandbox Code Playgroud)