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机器,因此无法确认它是否适用于该平台.
在检查文件是否不存在之后,您可以创建一个数据目录,在该目录中,在程序运行后创建"锁定文件".
如果它存在,您应该尝试与现有进程通信,该进程创建套接字或管道或类似的东西,并以适当的方式传递其地址或路径.
有许多不同的方法可以执行此操作,具体取决于程序运行的平台.