我在python和pyGtk中开发了一个程序,今天添加了单例功能,如果它已经运行,它不允许运行它。但现在我想更进一步,如果它正在运行,以某种方式让它调用self.window.present()来显示。
所以我一直在看信号,PIPE,FIFO,MQ,Socket等三个小时吧!我不知道我是不是看到它或者什么,但找不到这样做的方法(即使很多应用程序都这样做)
现在,排队将是:我如何向同一个脚本的运行实例发送“信号”(不是在无限的bucle中监听它,而是在做它的工作),让它调用一个函数?
我正在尝试发送信号,使用:
os.kill(int(apid[0]),signal.SIGUSR1)
并通过以下方式接收:
signal.signal(signal.SIGUSR1, self.handler)
def handler(signum, frame):
print 'Signal handler called with signal', signum
但它用
杀死了正在运行的进程Traceback (most recent call last):
File "./algest_new.py", line 4080, in <module>
gtk.main()
KeyboardInterrupt
答案 0 :(得分:0)
简单的答案是,你没有。当你说你实现了“单身功能”时,我不确定你的意思。看起来好像你期望第二个进程中的代码能够在第一个进程中看到单例对象,这显然是不可能的。但我可能误解了。
执行此操作的常用方法是在已知位置创建具有唯一名称的文件,通常包含正在运行的进程的进程ID。如果您启动程序并且它看到该文件已经存在,则它知道向用户解释已经存在正在运行的副本。您也可以向该进程发送一个信号(在Unix下,无论如何),告诉它将其窗口置于前台。
哦,不要忘记你的程序在终止时应删除PID文件: - )
答案 1 :(得分:0)
令人困惑的是,如果信号处理程序引发任何异常,gtk.main
将引发KeyboardInterrupt
异常。有了这个程序:
import gtk
import signal
def ohno(*args):
raise Exception("Oh no")
signal.signal(signal.SIGUSR1, ohno)
gtk.main()
启动后,从另一个进程调用os.kill(pid, signal.SIGUSR1)
会导致此异常:
File "signaltest.py", line 9, in <module>
gtk.main()
KeyboardInterrupt
这似乎是pygtk的问题 - 非gtk python应用程序中的signal.signal
处理程序引发的异常将执行预期的事情并显示处理程序的异常(例如“哦不”)。
简而言之:如果gtk.main
提升KeyboardInterrupt
以响应其他信号,请检查您的信号处理程序是否不会引发他们自己的异常。