如何将数据发送到正在运行的进程?

时间:2014-06-24 23:00:49

标签: process pygtk communication

我在pygtk中编写了一个简单的文本编辑器,它运行正常,我的问题是在程序运行时在新选项卡中打开新文件,比如notepad ++和许多其他文本编辑器。

假设我的程序正在运行,我在其中打开了一个简单的文本文件,然后在磁盘上选择一个新文件,右键单击它,然后选择要打开的程序,我的目标是打开此文件一个新的选项卡,在我正在运行的程序中,但是会发生什么,我的程序再次作为一个新进程启动。

我可以以某种方式与我的程序进程通信并发送我的新文件,还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

我使用套接字。

此代码在运行时将检查套接字是否已在侦听。如果是这样,这意味着应用程序的另一个实例已经在运行,因此它只是将其第一个参数(操作系统右键单击打开时传递给它的文件路径)传递给它并关闭。

如果没有套接字正在侦听,(没有应用程序打开)它会打开一个套接字,然后运行主GTK窗口。显示后续运行发送的任何文件路径,在这里您可以打开另一个选项卡。

CAVEAT:我不经常使用套接字,因此很可能有些事情没有100%正确完成,并且可能会导致挂起。

查看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()