我在信号处理程序中更改了一个全局变量,并在主程序中对其进行轮询。但是主线程中的值不会改变。
我是否需要使用限定符来使其成为易变(如Java)变量?
以下是该计划:
test.py
import time
import signal
def debug():
closeSession = False
def sigint_handler(signal, frame):
global closeSession
print('Breaking the poll...')
closeSession=True
signal.signal(signal.SIGINT, sigint_handler)
# Start a program...
while not closeSession:
time.sleep(1)
print('Polling... closeSession = %r' % closeSession)
print('Exiting! Bye.')
# Sent 'quit' to stdin of the program
if __name__ == "__main__":
debug()
每当我按 Ctrl + C 时, sigint_handler()
会被调用,但主线程中不会使用closeSession
的新值。
我得到以下输出:
$ python test.py
轮询... closeSession = False轮询...... closeSession = False
我按 Ctrl + C
^破坏民意调查......
民意调查...... closeSession = False
再次按 Ctrl + C
^破坏民意调查......
民意调查...... closeSession = False
再次按 Ctrl + C
^破坏民意调查......
民意调查...... closeSession = False
轮询... closeSession = False
答案 0 :(得分:2)
问题在于范围。
在debug()
函数中,您没有将closeSession
声明为全局,这意味着您有两个名为closeSession
的变量。 debug()
函数中的一个全局范围和一个范围。在sigint_handler()
函数中,您已明确指示使用全局函数,该函数由外部函数中的作用域遮蔽。
您可以通过在debug()
:
def debug():
global closeSession
closeSession = False
...
顺便说一下,你的代码在windows上不起作用,它会抛出一个IOError,因为sleep函数被中断了。对我有用的解决方法是:
...
while not closeSession:
try:
time.sleep(1)
except IOError:
pass
print('Polling... closeSession = %r' % closeSession)
...
它不漂亮但它有效。
答案 1 :(得分:1)
您必须在访问变量之前设置global closeSession
,否则您将创建一个具有相同名称的本地变量,并且循环永远不会结束。
试试这个:
import time
import signal
def debug():
global closeSession # <-- this was missing
closeSession = False
def sigint_handler(signal, frame):
global closeSession
print('Breaking the poll...')
closeSession=True
signal.signal(signal.SIGINT, sigint_handler)
# Start a program...
while not closeSession:
time.sleep(1)
print('Polling... closeSession = %r' % closeSession)
print('Exiting! Bye.')
# Sent 'quit' to stdin of the program
if __name__ == "__main__":
debug()