从osc lib模块中调用系统

时间:2012-05-23 20:50:41

标签: python osc opensoundcontrol

我正在使用找到的here的OSC库。 我想在收到特定的消息时以编程方式通过sys.exit()退出程序。

我使用以下内容:

oserve = OSC.OSCServer(('localhost', iportarg))
st = threading.Thread(target = oserve.serve_forever)
oserve.addMsgHandler("/logout", logout_handle)

def logout_handle(addr, tags, stuff, source):
    sys.exit()

发出消息'/ logout'会产生以下错误:

  

OSCServer:来自localhost的请求SystemExit:55827:

有没有人知道为什么会这样?我在一个已被线程锁定的子进程中? 似乎OSC lib /模块不允许我在它仍处于活动状态时发出系统进程。 任何想法都会很棒......

感谢, JML

1 个答案:

答案 0 :(得分:1)

我可以建议一种替代方法,使用标记done=False循环,直到doneTrue,然后通过终止st线程然后退出来清理。

from gevent import spawn
from gevent.event import AsyncResult
is_done = AsyncResult()
oserve = OSC.OSCServer(('localhost', iportarg))
gl = gevent.spawn(oserve.oserve_forever)
oserve.addMsgHandler("/logout", logout_handle)

def logout_handle():
  global is_done
  is_done.set(True)

terminate_prog = False
while not terminate_prog:
    if is_done.ready():
        terminate_prog = True


st.kill()
sys.exit()

这样的东西更适合imo,你可以正确地清理资源。

我们正在做的是制作一个可以与greenlet进行通信的AsyncResult,主要的greenlet循环直到它准备好退出侦听该异步结果,另一个greenlet有一个钩子,它最终执行logout_handle向主要的greenlet发出信号,是时候退出了。