如何从包中的兄弟模块导入?

时间:2017-04-27 11:08:46

标签: 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()

当我运行此操作时,我收到属性错误: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个模块彼此使用函数,并递归导入其他模块这一事实有关。

组织此软件包的正确方法是什么,以便兄弟模块可以相互导入函数?

1 个答案:

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