python - 如何从包中的同级模块导入?

标签 python module python-import python-module python-packaging

我的包具有以下结构:

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()

当我运行此命令时,出现属性错误:模块“myPackage”没有属性“plot”

我不确定为什么当它是我的包中的模块时它引用 plot 作为属性,或者为什么它引用 myPackage 作为模块。

然后我尝试导入我的包并以不同的方式调用该函数:

from myPackage import plot, signal

plot.plot_signal()

但是,现在我收到导入错误:cannot import name 'build_filter' 并且回溯指的是 plot.py ,它试图在其中导入 来自同级模块的 build_filter() 函数。

我认为这与两个模块相互使用函数并递归导入另一个模块这一事实有关。

组织这个包以便同级模块可以互相导入函数的正确方法是什么?

最佳答案

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

信号.py:

import myPackage.plot

myPackage.plot.plot_signal()

绘图.py

import myPackage.signal

myPackage.signal.build_filter()

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

信号.py:

from . import plot

plot.plot_signal()

绘图.py

from . import signal

signal.build_filter()

关于python - 如何从包中的同级模块导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656066/

相关文章:

python - 使用 Pytorch 实现 FFT

python - 如何将列表中的元组列表转换为一维数组?

Angular 可重用模块和组件

python - 如何使用argv将模块加载到python中

python - Python 如何知道从我正在处理的代码中导入,而不是从站点包中导入?

python - 枚举可以用在递归中吗?这个例子的递归是什么?

python - 如何以24小时时钟格式制作qt Designer的QDateTimeEdit小部件

ruby - 复制 Ruby 类有什么用吗? (我正在做粗俗的 mock 。)

ios - 如何访问模块中声明的变量?

python - 如何将我的模块添加到 travis-ci pythonpath