三个python个模块,相互调用

Three python modules, calling one another

我正在做一个项目,我有三个 python 模块(a.pyb.pyc.py)。

模块 a 正在调用模块 b,模块 b 正在调用模块 c,模块 c 正在调用模块 a .但是当 运行s.

时,行为非常奇怪

这是我的三个模块:

a.py

print('module a')
def a() : 
    print('inside a')
    return True

import b
b.b()

b.py

print('module b')

def b() : 
    print('inside b')
    return True

import c

c.c()

c.py

print('module c')

def c() : 
    print('inside c')
    return True

import a

a.a()

当我运行a.py时,观察到的输出是:

module a
module b
module c
module a
inside b
inside a
inside c
inside b

而预期的行为是:

module a
module b
module c
module a
inside b

为什么会这样?这样的实现有替代方法吗?

我认为主要的误解是您不希望所有模块在导入后都 运行,但它们确实如此。他们在执行另一次导入的脚本中间被打断,但他们会 return 完成命令。

所以最终发生的事情是:(为了清楚起见,我删除了函数声明)

print('module a')
import b
>>> importing b
    print('module b')
    import c
    >>> importing c
        print('module c')
        import a
        >>> importing a
            print('module a')
            import b
            >>> Doesn't reimport b
            b.b()
        a.a()
    c.c()
b.b()

所以只显示没有导入和嵌套的命令顺序:

print('module a')
print('module b')
print('module c')
print('module a')
b.b()
a.a()
c.c()
b.b()

这确实符合您的实际输出。

这与堆栈框架以及函数和导入的调用方式有关。

您从 运行宁 a.py 开始。

'module a'

首先发生的事情:import b

'module b'

b 中,c.py 被导入:

'module c'

模块 c 导入 a,我们得到:

'module a'

b 已经从 运行ning a.py 导入,所以这个调用import b 的通过(我们不重新导入 b.py)。我们接着看调用b.b()的效果,下一条语句:

inside b

而我们return到c.py的框架,这里我们称a.a() :

inside a

c.py有运行它的课程;接下来我们跳回到 b.py,我们离开的地方(导入之后),然后调用 c.c():

inside c

现在 b.py 也完成了 运行ning。最后我们 return 到我们 运行 程序的 a.py 帧,并调用 b.b():

inside b

希望这有助于解释这种行为。以下是如何纠正此问题并获得所需输出的示例:

a.py:

print("module a")
import b

def main():
    b.b()

def a():
    print("inside a")

if __name__ == "__main__":
    main()

b.py:

print("module b")
import c

def main():
    c.c()

def b():
    print("inside b")

if __name__ == "__main__":
    main()

c.py:

print("module c")
import a

def main():
    a.a()

def c():
    print("inside c")

if __name__ == "__main__":
    main()

Here's a link 来解释 if __name__ == "__main__": main() 调用会发生什么。本质上,它只会 运行 每个脚本的 main() 函数,如果这是首先构建的脚本 & 运行 。这样,你就得到了想要的输出:

module a
module b
module c
module a
inside b