我的软件包具有以下结构:
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()