6

我的包具有以下结构:

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()从同级模块导入函数的位置。

我认为这与这两个模块正在使用彼此的函数并递归导入另一个模块这一事实有关。

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

4

1 回答 1

4

To make mp.plot.plot_signal() work, you must import plot in the myPackage.__init__.py. Another thing is that in both plot.py and signal.py you should import the whole module to avoid circular imports:

signal.py:

import myPackage.plot

myPackage.plot.plot_signal()

plot.py

import myPackage.signal

myPackage.signal.build_filter()

You could also use the relative imports in all 3 files but it will work only in Python 3.x:

signal.py:

from . import plot

plot.plot_signal()

plot.py

from . import signal

signal.build_filter()
于 2017-04-27T11:28:29.620 回答