我的软件包具有以下结构:
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'
我不确定为什么将其plot
作为包中的模块时将其称为属性,或者为什么将其myPackage
称为模块。
然后,我尝试导入我的包并以其他方式调用该函数:
from myPackage import plot, signal
plot.plot_signal()
但是,现在我收到一个导入错误:cannot import name 'build_filter'
追溯是指plot.py
它试图build_filter()
从同级模块导入函数的位置。
我认为这与以下事实有关:两个模块相互使用功能,并递归导入另一个模块。
组织此程序包以使同级模块可以相互导入功能的正确方法是什么?
要进行mp.plot.plot_signal()
工作,您必须import plot
在中myPackage.__init__.py
。另一件事是,在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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句