gpt4 book ai didi

python - 需要了解 Python 信号和模块

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:13 25 4
gpt4 key购买 nike

我正在努力跟上 Python 的步伐,试图用它替换一些 C。我遇到了模块之间共享数据的问题,或者更可能是我对整个事情的理解。我有一个简化的信号模块:

import sys, signal

sigterm_caught = False

def SignalHandler(signum, stackframe):
if signum == signal.SIGTERM:
sigterm_caught = True
sys.stdout.write("SIGTERM caught\n")

def SignalSetup():
signal.signal(signal.SIGTERM, SignalHandler)

我的主要代码有一个这样的循环:

signals.SignalSetup()
while signals.sigterm_caught == False:
sys.stdout.write("sigterm_caught=%s\n" % str(signals.sigterm_caught))
time.sleep(5)

我运行它,然后终止进程,在 signals.py 中它获取信号,将 sigterm_caught 设置为 True,但是主进程中的循环没有看到 sigterm_caught 值的变化。

那么 (a) 我的方法对于 Python 方式来说是完全错误的吗?(b) 我在尝试引用模块中的变量时做错了什么吗?(c) 我应该以不同的方式处理信号,比如引发异常吗?

添加:是通过引发异常来处理信号更好,还是我的旧 C 方法仍然有效?

最佳答案

您需要在处理程序中添加一个global 语句:

def SignalHandler(signum, stackframe):
global sigterm_caught
if signum == signal.SIGTERM:
sigterm_caught = True
sys.stdout.write("SIGTERM caught\n")

默认情况下,Python 编译器将每个名称(如 sigterm_caught)视为函数的本地,如果函数似乎分配给名称; global 语句的作用是反转此默认值,以便 Python 编译器将名称视为 global(即,模块级顶级名称)。

关于python - 需要了解 Python 信号和模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2508748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com