不要退出python程序,但继续运行

时间:2013-02-15 21:57:18

标签: python

我已经看过其中一些问题,但尚未找到真正的答案。

我有一个启动gstreamer管道的应用程序,然后监听它发回的数据。

在我的一个示例应用程序中,它以这段代码结束:

gtk.main()

没有gtk窗口,但这段代码确实使它继续运行。没有它,该程序退出。

现在,我已经阅读了使用while True:的构造,但它们包含sleep命令,如果我没有弄错,那么会导致我的应用程序在睡眠期间冻结。 ..

有没有更好的方法,不使用gtk.main()?

2 个答案:

答案 0 :(得分:3)

gtk.main()运行事件循环。它不会退出,它不会冻结无所事事,因为它内部的代码类似:

while True:
    timeout = timers.earliest() - datetime.now()
    try:
        message = wait_for_next_gui_message(timeout)
    except TimeoutError:
        handle_any_expired_timers()
    else:
        handle_message(message)

wait_for_next_gui_message函数是不同平台特定函数的包装器,它们等待X11,WindowServer,Windows中未命名的东西等,以传递“用户点击按钮”或“用户点击按钮”等消息。 Q”。

如果您在http.serve_forever()twisted等上致电HTTPServer或类似内容,它会做同样的事情,除非它是一个wait_for_next_network_message(sources, timeout)函数,它包装了一些内容例如select.select,其中sources是所有套接字的列表。

如果你正在听gstreamer管道,你的sources就可以成为那个管道,而wait_for_next功能只是select.select

或者,当然,您可以使用twisted等网络框架。


但是,您不需要 以这种方式设计您的应用。如果您不需要等待多个来源,则可以阻止:

while True:
    data = pipe.read()
    handle_data(data)

确保管道未设置为非阻塞。如果您不确定,可以在套接字上使用setblocking,在Unix管道上使用fcntl,或者在Windows管道上使用我无法记住的东西来确保。

实际上,即使您需要等待多个源,也可以通过将每个源的阻塞循环放入单独的线程(或进程)来实现。这对于数千个套接字不起作用(尽管你可以使用greenlet代替线程),但它适用于3或30个。

答案 1 :(得分:1)

我已成为Cmd课程的粉丝。它为您的程序提供了一个shell提示符,并在等待输入时保持循环。这是link to the docs。它可能会做你想要的。