当我打开firefox时,运行命令:

firefox http://somewebsite

URL将在新的Firefox标签中打开(Chromium也会发生同样的情况)。有什么方法可以在Python中复制这种行为吗?例如,调用:
processStuff.py file/url

然后打电话:
processStuff.py anotherfile

不应启动两个不同的进程,而是向当前运行的程序发送消息。例如,您可以在一个选项卡式对话框中获得信息,而不是10个单窗口。
为任何能够描述Firefox/Chromium是如何跨平台完成这一任务的人添加赏金。

最佳答案

火狐的做法是:第一个实例创建一个套接字文件(或Windows上的命名管道)。这既可以作为下一个firefox实例检测第一个实例并与之通信的一种方式,也可以在死前将其转发到url。只能从本地系统上运行的进程访问套接字文件或命名管道(如文件所示),任何网络客户端都不能访问它。因为它们是文件,防火墙也不会阻止它们(就像在文件上写一样)。
下面是一个简单的实现来说明我的观点。第一次启动时,会创建socket文件。进一步启动脚本将检测锁并向其发送URL:

import socket
import os

SOCKET_FILENAME = 'lock.sock'

def server():
    print 'I\'m the server, creating the socket'
    s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    s.bind(SOCKET_FILENAME)

    try:
        while True:
            print 'Got a URL: %s' % s.recv(65536)
    except KeyboardInterrupt, exc:
        print 'Quitting, removing the socket file'
        s.close
        os.remove(SOCKET_FILENAME)

def client():
    print 'I\'m the client, opening the socket'
    s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    s.connect(SOCKET_FILENAME)
    s.send('http://stackoverflow.com')
    s.close()

def main():
    if os.path.exists(SOCKET_FILENAME):
        try:
            client()
        except (socket.error):
            print "Bad socket file, program closed unexpectedly?"
            os.remove(SOCKET_FILENAME)
            server()
    else:
        server()

main()

您应该实现一个适当的协议(例如,发送适当的数据报而不是硬编码长度),可以使用SocketServer,但这已经超出了这个问题。Python Socket Programming Howto也可能对您有所帮助。我没有可用的Windows计算机,因此无法确认它是否在该平台上工作。

关于python - 只运行一个python程序(如Firefox)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6992427/

10-11 12:42
查看更多