我有一个带有main函数的模块,当一个标志为true时,它运行一个循环。 在循环中,调用另一个模块中定义的函数来检查条件,如果它是True,则应该停止主循环。
代码是:
main.py
import other
isRunning = True
def shutdown():
global isRunning
isRunning = False
def main():
while isRunning:
# some logic here
other.check()
if __name__ == '__main__':
main()
other.py
import main
def check():
someCondition = #some logic to check the condition
if someCondition:
main.shutdown()
代码运行时启动main.py
文件。
问题是当在循环中调用other.check()
时,会调用main.shutdown()
函数,但主循环会继续运行。在主循环中,isRunning
变量始终为True
,但我希望在False
函数中设置后变为main.shutdown()
。
为什么会这样?我错过了什么?
我可以重构代码以更智能的方式管理循环退出,但我很想知道是否有解决方案保留这种代码结构。
答案 0 :(得分:4)
该问题与正在加载两次的main.py
文件有关。当您将其作为脚本运行时,它首先以__main__
加载。它也会被other.py
导入为常规名称main
。
这两个副本彼此完全分开,并且具有单独的全局变量!当other.check
调用main.shutdown
来修改isRunning
全局变量时,它只会更改main.isRunning
版本,而不会更改__main__.isRunning
。主要功能是检查__main__.isRunning
哪些内容无法更改。
有几种方法可以解决这个问题。最好的可能是以某种方式摆脱你的循环导入。虽然循环导入可以在Python中正常工作,但它通常是糟糕设计的症状。将它与任何可能作为脚本运行的模块一起使用是一个非常糟糕的主意。
答案 1 :(得分:3)
试试这个:
import other
def main():
while other.run():
# some logic here
other.check()
if __name__ == '__main__':
main()
other.py
import main
isRunning = True
def run():
return isRunning
def check():
global isRunning
someCondition = #some logic to check the condition
if someCondition:
isRunning = False
如果我是你,我会使用对象和类......,全局方法和变量不是"调试和维护友好"