代码之家  ›  专栏  ›  技术社区  ›  codebunny

需要了解Python信号和模块

  •  3
  • codebunny  · 技术社区  · 16 年前

    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)
    

    我运行它,然后杀死进程,inside signals.py它获取信号,将sigterm\u catch设置为True,但是主进程中的循环没有看到sigterm\u catch值的变化。

    (b) 我尝试引用模块中的变量时是否做错了什么? (c)我是否应该以不同的方式处理信号,比如引发异常?

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

    2 回复  |  直到 16 年前
        1
  •  8
  •   Alex Martelli    16 年前

    你需要添加一个 global

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

    默认情况下,Python编译器将每个名称(如 sigterm_caught 地方的 全球的 语句将反转此默认值,以便Python编译器将该名称视为 全球的 (即,模块级的顶级名称)。

        2
  •  3
  •   extraneon    16 年前

    如果你是 要创建全局变量,请使用全局变量:

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