我會使用套接字。
此代碼在運行時會檢查套接字是否已在監聽。如果是這樣,這意味着應用程序的另一個實例已經在運行,所以它只是傳遞它的第一個參數(當您右鍵單擊打開它時由操作系統傳遞給它的文件路徑)並關閉它。
如果沒有套接字在監聽,(沒有應用程序打開),它會打開一個套接字,然後運行主GTK窗口。隨後運行發送的任何文件路徑都會顯示出來,在這裏您可以打開另一個選項卡。
CAVEAT:我不經常使用套接字,所以很可能有些事情沒有被正確完成,並且可能導致掛起。
查看here的插座指南。
import socket
import select
import sys
import gtk
if len (sys.argv) > 1:
filename = sys.argv[1]
else:
filename = ''
class MyApp():
def __init__(self, filename):
self.filename = filename
win = gtk.Window()
win.set_size_request(320,200)
win.connect('destroy',gtk.main_quit)
tv = gtk.TextView()
self.buff = tv.get_buffer()
win.add(tv)
win.show_all()
self.open_file()
# This timeout runs check_for_file every 200ms
gtk.timeout_add(200, self.check_for_file)
def check_for_file(self):
"""
Check if filename is waiting to be read from the socket
open file if it is
"""
readable,writeable,inerror = select.select([serversock],[],[],0)
if len (readable) > 0:
client,addr = serversock.accept()
self.filename = client.recv(1024)
self.open_file()
# Must always return 'True', or the timeout loop will stop.
return(True)
def open_file(self):
"""Dummy function, prints filename to open"""
self.buff.insert_at_cursor('Opening file {}\n'.format(self.filename))
if __name__ == '__main__':
"""
Try to open connection to a socket. If successfull, app is already
running, send filename to it and quit.
If unsuccessful, app is NOT running, open a listening socket and run
app.
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(('localhost',4689))
except socket.error:
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.bind(('localhost',4689))
serversock.listen(2)
else:
sock.send(filename)
sock.close()
sys.exit()
app = MyApp(filename)
gtk.main()
serversock.close()