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()从同级模块导入函数的位置。
我认为这与以下事实有关:两个模块彼此使用函数,并递归地导入另一个模块。
组织此程序包以使同级模块可以相互导入功能的正确方法是什么?
为了mp.plot.plot_signal()工作,你必须import plot在myPackage.__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)
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |