尝试导入导入子模块的子模块时出现导入错误

Import Error on trying to import a submodule that imports a submodule

我觉得我缺少一些简单和基本的东西。这是一个玩具设置

PythonProject/
main.py
x/
    a.py
    y/
        b.py

b.py 有一个没有依赖关系的函数 foo

def foo():
    print("Hello World")

a.py 需要来自 b.py 的 foo 才能工作并直接导入它

import y.b
def bar():
    #Do some stuff
    y.b.foo()

main.py 需要 a.py

的栏
import x.a
x.a.bar()

现在,运行ning a.py 工作正常,它成功导入 b 并找到 foo。 尝试 运行 main.py 但是会因导入错误而中断:特别是 "import b" 在 "import a"

期间失败

我的印象是需要发生的事情是 b 需要通过 a/ 中的 __init__.py 公开,但我不确定这样做的 pythonic 方式是什么会的。

导入模块 (a) 的首选解决方案是什么,该模块导入另一个模块 (b) 最好不要将 PythonProject 意识引入 a?

来自Importing files from different folder in Python

main.py

import sys
sys.path.insert(0, 'C:/path/x')
import a
a.bar()

a.py

import sys
sys.path.insert(0, 'C:/path/x/y')
import b
def bar():
    #Do some stuff
    b.foo()

b.py

def foo():
    print("Hello World")

即使 Paul H 提到了答案,也从未得到正确回答。

很简单,提到但没有直接说明here

如果你有这样的目录:

sound/                      Top-level package
  __init__.py               Initialize the sound package
  formats/                  Subpackage for file format conversions
          __init__.py
          wavread.py
          wavwrite.py
          aiffread.py
          aiffwrite.py
          auread.py
          auwrite.py
          ...
  effects/                  Subpackage for sound effects
          __init__.py
          echo.py
          surround.py
          reverse.py
          ...
  filters/                  Subpackage for filters
          __init__.py
          equalizer.py
          vocoder.py
          karaoke.py
          ...

(例如"effects")中的__init__.py文件需要包含

import effects.echo
import effects.surround
import effects.reverse

要从子模块内部调用子模块,例如,echo 调用 surround,则需要将 surround 导入 echo 使用 import effects.surround as surround