我的包具有以下结构:
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()
函数。
我认为这与2个模块彼此使用函数,并递归导入其他模块这一事实有关。
组织此软件包的正确方法是什么,以便兄弟模块可以相互导入函数?
答案 0 :(得分:3)
要使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()