Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何调试这个模块_Python - Fatal编程技术网

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)。这是一个糟糕设计的标志。我知道,圆形是糟糕设计的标志,我将以更有组织的方式重新组织模块的布局。模块方法的“无”与其他模块中的其他方法没有任何依赖关系。即使有这种独立性,我会触发一个循环错误吗?谢谢你的详细解释!我把有问题的方法从我编写的模块中拉出来,放在一个包含常用方法的模块中。我问了我的问题,这样我就可以了解造成恐怖的细节,而你的回答正是如此!