三个python个模块,相互调用
Three python modules, calling one another
我正在做一个项目,我有三个 python 模块(a.py
、b.py
和 c.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
我正在做一个项目,我有三个 python 模块(a.py
、b.py
和 c.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