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



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

myPackage
 -- __init__.py <-- empty
 -- signal.py
 -- plot.py

signal.py包含:

from plot import plot_signal
def build_filter():
   ...
def other_function():
   plot_signal()

plot.py包含:

from signal import build_filter
def plot_signal():
   ...
def other_function():
   build_filter()

我有使用此软件包的脚本,其中包含以下内容:

import myPackage as mp
mp.plot.plot_signal()

当我运行时,我会收到一个属性错误: module 'myPackage' has no attribute 'plot'

我不确定为什么当它的包装中的一个模块或为什么将myPackage称为模块时,它将其称为 plot

然后,我尝试导入我的软件包并以不同的方式调用该功能:

from myPackage import plot, signal
plot.plot_signal()

但是,现在我收到了导入错误:cannot import name 'build_filter',The Trackback指的是plot.py,其中它试图从同胞模块导入build_filter()函数。

我认为这与这两个模块使用彼此的函数并递归导入另一个模块有关。

组织此软件包的正确方法是什么,以便兄弟姐妹模块可以彼此导入功能?

要使mp.plot.plot_signal()起作用,您必须在myPackage.__init__.py中进行import plot。另一件事是,在plot.py和signal.py中,您应该导入整个模块以避免循环导入:

signal.py:

import myPackage.plot
myPackage.plot.plot_signal()

plot.py

import myPackage.signal
myPackage.signal.build_filter()

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

signal.py:

from . import plot
plot.plot_signal()

plot.py

from . import signal
signal.build_filter()

相关内容

  • 没有找到相关文章

最新更新