只运行一个python程序(如Firefox)?

NoB*_*ugs 14 python firefox google-chrome process

当我打开Firefox时,然后运行命令:

firefox http://somewebsite
Run Code Online (Sandbox Code Playgroud)

该网址在Firefox的新标签页中打开(同样的事情也发生在Chromium上).有没有办法在Python中复制这种行为?例如,调用:

processStuff.py file/url
Run Code Online (Sandbox Code Playgroud)

然后打电话:

processStuff.py anotherfile
Run Code Online (Sandbox Code Playgroud)

不应该启动两个不同的进程,而是当前正在运行的程序发送一条消息.例如,您可以在一个选项卡式对话框中使用信息而不是10个单个窗口.

为任何能够描述Firefox/Chromium 如何以跨平台方式执行此操作的人添加赏金.

ndf*_*red 24

Firefox的方式是:第一个实例创建一个套接字文件(或Windows上的命名管道).这既可以作为Firefox的下一个实例检测第一个实例并与之通信的方式,也可以在死亡之前将其转发给URL.套接字文件或命名管道只能从本地系统上运行的进程访问(如文件所示),没有网络客户端可以访问它.由于它们是文件,防火墙也不会阻止它们(就像在文件上写一样).

这是一个天真的实现来说明我的观点.首次启动时,将lock.sock创建套接字文件.进一步启动脚本将检测锁并将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()
Run Code Online (Sandbox Code Playgroud)

你应该实现一个合适的协议(例如发送适当的数据报而不是硬编码长度),也许使用SocketServer,但这超出了这个问题.在Python的Socket编程HOWTO也可能帮助你.我没有可用的Windows机器,因此无法确认它是否适用于该平台.


glg*_*lgl 8

在检查文件是否不存在之后,您可以创建一个数据目录,在该目录中,在程序运行后创建"锁定文件".

如果它存在,您应该尝试与现有进程通信,该进程创建套接字或管道或类似的东西,并以适当的方式传递其地址或路径.

有许多不同的方法可以执行此操作,具体取决于程序运行的平台.