python如何调试这个模块
我在从特定模块导入时遇到问题,但通常不从模块导入。我的项目结构:python如何调试这个模块,python,Python,我在从特定模块导入时遇到问题,但通常不从模块导入。我的项目结构: project-folder aaa-folder __init__.py a.py bbb-folder __init__.py b.py ccc-folder __init__.py c.py 所有init.py文件均为空。项目文件夹位于my sys.path中 模块b: from aaa.a import a_method from ccc.c import c_
project-folder
aaa-folder
__init__.py
a.py
bbb-folder
__init__.py
b.py
ccc-folder
__init__.py
c.py
所有init.py文件均为空。项目文件夹位于my sys.path中
模块b:
from aaa.a import a_method
from ccc.c import c_method
def b_method(): print 'bye'
print 'hi'
模块c:
from aaa.a import a_method
from bbb.b import b_method
def c_method(): print 'bye'
print 'hi'
单元a:
from bbb.b import b_method
from ccc.c import c_method
def a_method(): print 'bye'
print 'hi'
我可以从pythonshell导入每个方法。模块b和c都从命令行运行,只返回“hi”。当我运行模块a时,我得到ImportError:没有名为b的模块
我在哪里可以找到问题的线索?正如在评论中多次提到的,您正在设计使用循环导入的项目: 当两个模块都使用“导入”时,循环导入就可以了 进口形式。当第二个模块想要获取一个名称时,它们失败 第一个(“来自模块导入名称”),导入位于顶部 水平。这是因为第1行中的名称还不可用,因为 第一个模块正忙于导入第二个模块 如果您在每个模块的最顶端放置一个print语句,您将看到发生了什么 示例a、b、c:
打印“aaa内部”#bbb、ccc
当您执行模块a
时,您将得到以下结果:
$ python aaa/a.py
inside aaa
inside bbb
inside aaa
Traceback (most recent call last):
File "aaa/a.py", line 2, in <module>
from bbb.b import b_method
File "/Users/user/Desktop/project/bbb/b.py", line 2, in <module>
from aaa.a import a_method
File "/Users/user/Desktop/project/aaa/a.py", line 2, in <module>
from bbb.b import b_method
ImportError: cannot import name b_method
$python aaa/a.py
内部aaa
内bbb
内部aaa
回溯(最近一次呼叫最后一次):
文件“aaa/a.py”,第2行,在
从bbb.b导入b_方法
文件“/Users/user/Desktop/project/bbb/b.py”,第2行,在
从aaa.a导入a_方法
文件“/Users/user/Desktop/project/aaa/a.py”,第2行,在
从bbb.b导入b_方法
ImportError:无法导入名称b_方法
a.py
转到导入b.py
,但是b
需要a
,因此它返回到该模块,在该模块中可以看到其余的bbb
导入。此时,b
仅部分加载,因此尚未定义b_方法。所以你会撞车
您应该做的是避免让您的模块在循环中相互导入。应该有一组公共模块,其他所有模块都为其导入共享功能。但正如python常见问题解答中所述,只需导入模块名称空间(import bbb
)即可解决此问题。请确保将python路径设置为包含根文件夹。这是使用循环导入。您有循环引用(A需要B和C都需要A)。这是一个糟糕设计的标志。我知道,圆形是糟糕设计的标志,我将以更有组织的方式重新组织模块的布局。模块方法的“无”与其他模块中的其他方法没有任何依赖关系。即使有这种独立性,我会触发一个循环错误吗?谢谢你的详细解释!我把有问题的方法从我编写的模块中拉出来,放在一个包含常用方法的模块中。我问了我的问题,这样我就可以了解造成恐怖的细节,而你的回答正是如此!