如何从包中的同级模块导入?

Sim*_*mon 5 python module python-module python-import python-packaging

我的软件包具有以下结构:

myPackage
 -- __init__.py <-- empty
 -- signal.py
 -- plot.py
Run Code Online (Sandbox Code Playgroud)

signal.py包含:

from plot import plot_signal

def build_filter():
   ...

def other_function():
   plot_signal()
Run Code Online (Sandbox Code Playgroud)

plot.py包含:

from signal import build_filter

def plot_signal():
   ...

def other_function():
   build_filter()
Run Code Online (Sandbox Code Playgroud)

然后,我就有了使用此程序包的脚本,该程序包包含以下内容:

import myPackage as mp

mp.plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

运行此命令时,出现属性错误: module 'myPackage' has no attribute 'plot'

我不确定为什么将其plot作为包中的模块时将其称为属性,还是将其myPackage称为模块。

然后,我尝试导入我的包并以其他方式调用该函数:

from myPackage import plot, signal

plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

但是,现在我收到一个导入错误:cannot import name 'build_filter'追溯是指plot.py它试图build_filter()从同级模块导入函数的位置。

我认为这与以下事实有关:两个模块彼此使用函数,并递归地导入另一个模块。

组织此程序包以使同级模块可以相互导入功能的正确方法是什么?

mat*_*ino 4

为了mp.plot.plot_signal()工作,你必须import plotmyPackage.__init__.py. 另一件事是,在plot.py和signal.py中,您应该导入整个模块以避免循环导入:

信号.py:

import myPackage.plot

myPackage.plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

绘图.py

import myPackage.signal

myPackage.signal.build_filter()
Run Code Online (Sandbox Code Playgroud)

您还可以在所有 3 个文件中使用相对导入,但它仅适用于 Python 3.x:

信号.py:

from . import plot

plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

绘图.py

from . import signal

signal.build_filter()
Run Code Online (Sandbox Code Playgroud)