【发布时间】:2017-09-25 03:32:24
【问题描述】:
我的包有以下结构:
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() 函数。
我认为这与这两个模块使用彼此的函数并递归导入另一个模块这一事实有关。
组织这个包以便兄弟模块可以相互导入函数的正确方法是什么?
【问题讨论】:
-
@matino:我将语言标签更改为“python-3.x”,因为这显然是 OP 正在使用的(python 2 产生不同的错误消息)。你为什么把它放回“python”?
-
@martineau - 我认为这个问题与所有版本的python有关,不管错误信息如何,但如果你愿意,可以随时恢复python-3x。
-
@matino:你在这两个版本中都试过你的解决方案了吗?
-
@martineau - 是的,我做到了
标签: python module python-import python-module python-packaging