Vamos começar dizendo que existem muitas e muitas maneiras. Você normalmente configura um token / identificador quando o programa é iniciado, para que instâncias posteriores possam procurar a existência desse token.
Eu descreverei uma maneira que usa dbus.
Visão geral:
Ao iniciar um programa, ele pode se registrar na sessão dbus com um nome exclusivo (por exemplo, "org.nicklemaire.myprogram"). Outras instâncias do programa podem verificar se esse ponto de acesso já está registrado e, em caso afirmativo, informar ao programa o que fazer por meio desse ponto de acesso dbus (por exemplo, obter foco, abrir um site, reproduzir uma música). A última parte é provavelmente necessária quando você quer um comportamento semelhante ao "firefox askubuntu.com", que abre esta página em uma nova aba em uma instância já em execução.
Código:
#!/usr/bin/env python
import sys
import gtk
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from multiprocessing import Process
class MyDBUSService(dbus.service.Object):
def __init__(self):
bus_name = dbus.service.BusName('org.nicklemaire.myprogram', bus=dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name, '/org/nicklemaire/myprogram')
@dbus.service.method('org.nicklemaire.myprogram', in_signature='s')
def startup(self, arg):
print "got the following parameter from another instance:", arg
def call_instance():
try:
bus = dbus.SessionBus()
programinstance = bus.get_object('org.nicklemaire.myprogram', '/org/nicklemaire/myprogram')
bus = dbus.SessionBus()
programinstance = bus.get_object('org.nicklemaire.myprogram', '/org/nicklemaire/myprogram')
startup = programinstance.get_dbus_method('startup', 'org.nicklemaire.myprogram')
try:
arg = sys.argv[1]
except IndexError:
arg = ""
startup(arg)
print "Another instance was running and notified."
except dbus.exceptions.DBusException:
exit(-1) # process had an error
if __name__ == "__main__":
p = Process(target=call_instance)
p.start()
p.join()
if p.exitcode > 0: # process had an error
DBusGMainLoop(set_as_default=True)
myservice = MyDBUSService()
gtk.main()
Teste:
Abra um terminal e execute o programa: myprogram.py
. Ele não será encerrado porque atualmente queremos que ele seja executado e aguarde até que uma segunda instância seja iniciada.
Agora faça isso: abra outro terminal e execute o programa novamente, desta vez com um argumento adicional myprogram.py askubuntu.com
.
Deve imprimir: "Outra instância foi executada e notificada."
Enquanto no primeiro terminal, você deve obter uma saída semelhante a esta: "obteve o seguinte parâmetro de outra instância: askubuntu.com"
A outra parte da sua pergunta: criar um programa é descrita aqui:
Basicamente, você precisa chamar mywindow.present()
no método startup
.