Python - Trigger Event quando un'altra istanza dello script è lanciata

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
tubbadu
Prode Principiante
Messaggi: 92
Iscrizione: venerdì 11 dicembre 2020, 13:58
Desktop: plasma
Distribuzione: Kubuntu 20.10
Sesso: Maschile

Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da tubbadu »

ciao a tutti, vi spiego il mio problema: ho bisogno di realizzare uno script in python in grado di essere "controllato" tramite il terminal (uno qualsiasi, non solo quello dal quale è stato lanciato), provo a farvi un esempio:

se io lancio myscript.py, lui si apre e avvia l'interfaccia grafica (realizzata con Tkinter)
dopodichè, se io, in un qualsiasi terminal, lanciassi

Codice: Seleziona tutto

myscript.py --dosomething
lui non deve avviare una nuova istanza, ma eseguire in quella già attiva un comando, eseguire una funzione ad esempio

non ho la minima idea di come possa fare a "comunicare" in questo modo con un'istanza già attiva ma penso che non sia un'impresa così impossibile...
ho provato a cercare su internet ma non ho trovato nulla di neanche simile a quello che serve a me, probabilmente non ho cercato correttamente perchè non so bene in gergo come si chiami questa cosa che voglio fare :lol:

scusate la confusione, ma sono confuso anch'io!
grazie in anticipo!

Ale
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

tubbadu ha scritto:
sabato 30 ottobre 2021, 16:20
ho provato a cercare su internet ma non ho trovato nulla di neanche simile a quello che serve a me, probabilmente non ho cercato correttamente perchè non so bene in gergo come si chiami questa cosa che voglio fare
Ci sono pacchi di discussioni a riguardo in rete.
Per trovare quelle relative alla possibilità di lanciare una singola istanza di un programma, clicca qui
Per trovare quelle relative a come comunicare con un programma già avviato, clicca qui

Sono risultati per la maggior parte in lingua inglese, butta un occhio poi magari si discute nello specifico.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da nuzzopippo »

tubbadu ha scritto:
sabato 30 ottobre 2021, 16:20
dopodichè, se io, in un qualsiasi terminal, lanciassi

Codice: Seleziona tutto

myscript.py --dosomething
lui non deve avviare una nuova istanza, ma eseguire in quella già attiva un comando, eseguire una funzione ad esempio
Ben dice @vaeVictis in rete ne trovi di roba.

In ogni caso, se la Tua applicazione deve gestire chiamate esterne DEVE stabilire una qualche porta di ascolto ed un gestore di ascolto, utilizzando i socket puoi farlo tanto in locale quanto in rete, non è semplicissimo però.

[Edit] avevo saltato l'argomento : riguardo l'esecuzione unica della applicazione potresti implementarla in modo relativamente semplice utilizzando un file di lock, ossia un file in cui scrivi qualcosa quando l'applicazione si avvia e cancelli quando chiudi, ovviamente in tal caso l'applicazione dovrebbe rilevare l'esistenza del file per prima cosa al suo avvio ed in caso lo trova uscire immediatamente senza far nulla ... è un sistema rozzo e soggetto a qualche rischio (crash senza cancellazione = non avvia) ma è "semplice"
Ultima modifica di nuzzopippo il sabato 30 ottobre 2021, 18:45, modificato 1 volta in totale.
Fatti non foste a viver come bruti ...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

@nuzzopippo
Per quanto riguarda la comunicazione di rete, dopo aver pianto intere giornate, sono arrivato a scoprire la libreria ZMQ, che ha binding per una marea di linguaggi ed è molto semplice da usare.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da nuzzopippo »

vaeVictis ha scritto:
sabato 30 ottobre 2021, 18:40
@nuzzopippo
Per quanto riguarda la comunicazione di rete, dopo aver pianto intere giornate, sono arrivato a scoprire la libreria ZMQ, che ha binding per una marea di linguaggi ed è molto semplice da usare.
Aiuta sul flush dati nel TCP-IP? ... Io son fermo al "metallo" :D
Fatti non foste a viver come bruti ...
tubbadu
Prode Principiante
Messaggi: 92
Iscrizione: venerdì 11 dicembre 2020, 13:58
Desktop: plasma
Distribuzione: Kubuntu 20.10
Sesso: Maschile

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da tubbadu »

Grazie a tutti! ho trovato questi script di esempio in rete che rimaneggiati a dovere dovrebbero realizzare il mio scopo:

Codice: Seleziona tutto

#!/usr/bin/python3

# -*- coding: utf-8 -*-
import socket
import os, os.path
import time

if os.path.exists( "/tmp/python_unix_sockets_example" ):
  os.remove( "/tmp/python_unix_sockets_example" )

print ("Opening socket...")
server = socket.socket( socket.AF_UNIX, socket.SOCK_DGRAM )
server.bind("/tmp/python_unix_sockets_example")

print ("Listening...")
while True:
  datagram = server.recv( 1024 )
  if not datagram:
    break
  else:
    print ("-" * 20)
    print (datagram)
    if "DONE" == datagram:
      break
print ("-" * 20)
print ("Shutting down...")
server.close()
os.remove( "/tmp/python_unix_sockets_example" )
print ("Done")

Codice: Seleziona tutto

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
import os, os.path

print ("Connecting...")
if os.path.exists( "/tmp/python_unix_sockets_example" ):
  client = socket.socket( socket.AF_UNIX, socket.SOCK_DGRAM )
  client.connect( "/tmp/python_unix_sockets_example" )
  print ("Ready.")
  print ("Ctrl-C to quit.")
  print ("Sending 'DONE' shuts down the server and quits.")
  while True:
    try:
      x = bytes(input( "> " ), 'utf-8')
      if "" != x:
        print ("SEND:", x)
        client.send( x )
        if "DONE" == x:
          print ("Shutting down.")
          break
    except KeyboardInterrupt:#, k:
      print ("Shutting down.")
  client.close()
else:
  print ("Couldn't Connect!")
print ("Done")

Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

@tubbadu
Quello script risolve solo il problema della comunicazione con il programma avviato, non la possibilità di avviarne uno solo.
Anche se forse ho interpretato in modo troppo stringente la tua richiesta:
lui non deve avviare una nuova istanza
@nuzzopippo
Fa tutto lui.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
tubbadu
Prode Principiante
Messaggi: 92
Iscrizione: venerdì 11 dicembre 2020, 13:58
Desktop: plasma
Distribuzione: Kubuntu 20.10
Sesso: Maschile

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da tubbadu »

vaeVictis ha scritto:
sabato 30 ottobre 2021, 19:57
@tubbadu
Quello script risolve solo il problema della comunicazione con il programma avviato, non la possibilità di avviarne uno solo.
Anche se forse ho interpretato in modo troppo stringente la tua richiesta:
lui non deve avviare una nuova istanza
@nuzzopippo
Fa tutto lui.
era il mio problema principale, per controllare che non ci siano già istanze avviate mi basta un pgrep -a python3 e poi controllo nella lista se c'è già il mio processo
ci sarà sicuramente un metodo migliore ma questo so che funziona, poi c'è sempre spazio per migliorare!

grazie ancora a tutti!
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

Se ho capito bene, e chiami pgrep dall'interno dello script Python, sappi che hai appena inserito una falla di sicurezza all'interno del programma.
Cosa che avviene ogni volta che si ricorre a una chiamata a un comando del terminale da dentro un programma.

Se c'è modo di farlo direttamente con funzioni built-in di Python, usa quella. Il programma è portabile, è più performante ed è più sicuro e meno propenso ad errori di parsing dell'output del comando della shell.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da nuzzopippo »

vaeVictis ha scritto:
sabato 30 ottobre 2021, 19:57
@nuzzopippo
Fa tutto lui.
Grazie della dritta @vaeVictis, alla prima "occorrenza" guarderò la libreria

@tubbadu
Se hai idea di utilizzare i socket (o ZMq) dovrai "aprire" una porta di ascolto, quindi Ti basterebbe verificare che la porta non sia già occupata prima ancora di avviare il mainloop di Tk, se è occupata scrivi due righe nel terminale ed esci.

Per altro, l'indicazione di @vaeVictis è giustissima, il terminale è molto più efficiente delle GUI, potendo evitale
Fatti non foste a viver come bruti ...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

nuzzopippo ha scritto:
domenica 31 ottobre 2021, 5:58
Per altro, l'indicazione di @vaeVictis è giustissima, il terminale è molto più efficiente delle GUI, potendo evitale
Non ho capito :)
Io intendevo che è meglio evitare di usare comandi bash all'interno di uno script Python (pgrep nel suo caso) se è possibile fare la stessa operazione direttamente con librerie di Python stesso (in questo caso psutil o simili)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da nuzzopippo »

Sono stato troppo sintetico, temo : trovo giusta la Tua indicazione, sul mix bash/python, inoltre, dato che è un programma che parte da terminale stavo suggerendo di vedere un po' se è proprio necessaria una interfaccia grafica per la sua applicazione, potendola evitare ridurrebbe di molto il codice necessario ed eviterebbe di dover fare tutto all'interno del mainloop di tkinter, che è bloccante ...

Comunque, avrei potuto evitare di fare considerazioni in più ssu condizioni che solo lo OP conosce, la mia intenzione iniziale era di indicare una ulteriore sbrigativa possibilità di verifica preliminare delle condizioni applicative (porta occupata = possibile app avviata o, comunque, problemi di comunicazione = interrompere avvio)
Fatti non foste a viver come bruti ...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

Ah, ok, non avevo compreso. In effetti, io le GUI non le ho mai usate. Ci ho cannato anche un paio di posti di lavoro perché non conosco TkInter, per dire. So solo che ha un mainloop :D

Una domanda, @nuzzopippo: in generale, quando si avvia un programma che usa le porte per comunicare, si deve verificare che quella porta non sia già usata? Io non l'ho mai controllato, ma in effetti se fosse già in uso potrebbero arrivare segnali non voluti. Che dici?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da nuzzopippo »

vaeVictis ha scritto:
domenica 31 ottobre 2021, 10:24
Una domanda, @nuzzopippo: in generale, quando si avvia un programma che usa le porte per comunicare, si deve verificare che quella porta non sia già usata? Io non l'ho mai controllato, ma in effetti se fosse già in uso potrebbero arrivare segnali non voluti. Che dici?
Se una porta è già occupata, un socket non può aprila, si riceve una eccezione ... giusto per esemplificare, prendiamo l'esempio dello eco-server nella docs e manipoliamolo in modo da intercettare una eccezione qualsiasi

Codice: Seleziona tutto

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port

try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)
except Exception as e:
    print(repr(e))
poi apriamo due sessioni di terminale, con entrambe andiamo nella directory dello script e lo lanciamo, la prima andrà liscia, il socket si mette in ascolto e rimane in attesa di connessioni sino a che un CTRL+C od un evento di sistema non lo sbatte fuori, il secondo lancio, invece :

Codice: Seleziona tutto

NzP:~$ cd src/posts/vaeVictis
NzP:~$ python3 server.py
OSError(98, 'Address already in use')
NzP:~$ 
trova la porta occupata (su tutti gli indirizzi disponibili) e riceve quindi un errore, lo comunica ed esce.
Tal genere di errore, credo di non sbagliare, sorge già a livello di sistema operativo, una porta non mi sembra sia concessa all'uso contemporaneo di due applicazioni diverse.

Quanto su accade dal lato server, dal lato client potrebbe NON succedere, se il server è inizializzato in modo da ricevere più comunicazioni, un clisent aprirebbe una porta "a caso" tra quelle disponibili e si connetterebbe alla specifica porta "50007" dello indirizzo di comunicazione, e varie sessioni client non interfirebbero tra loro.
... certo, non interferirebbero se il lato server è gestito correttamente, dato che ogni singolo collegamento ha una sua specifica e precisa connessione, poi a creare caos siamo tutti bravi, bastano idee poco chiare o un po' di disattenzione.

Comunque è un argomento "stuzzichevole", ogni tanto sono tentato di approfondire e sperimentare un po' sull'argomento, in particolare circa "strumenti" limitati ad una LAN locale, in genere li trovi in soluzioni "per internet", quindi con caratteristiche poco "prudenti" per l'ambito interno ... in ufficio ne ho realizzato qualcuno, principalmente con java, con python no, sono poco preparato ad operare in ambito windows con questo linguaggio.
Fatti non foste a viver come bruti ...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Python - Trigger Event quando un'altra istanza dello script è lanciata

Messaggio da vaeVictis »

Gentilissimo, mi leggo con calma la spiegazione.
Evidentemente nella mia applicazione mi è sempre andata bene. Devo aggiungere una gestione delle eccezioni.
Grazie.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 16 ospiti