Quería hacer lo mismo que, pero quería hacerlo en un archivo.
Entonces la lógica sería:
- si se está ejecutando un script con mi nombre, elimínelo y luego salga
- si no se está ejecutando un script con mi nombre, haga algo
Modifiqué la respuesta de Bakuriu y se me ocurrió esto:
from os import getpid
from sys import argv, exit
import psutil ## pip install psutil
myname = argv[0]
mypid = getpid()
for process in psutil.process_iter():
if process.pid != mypid:
for path in process.cmdline():
if myname in path:
print "process found"
process.terminate()
exit()
## your program starts here...
Ejecutar el script hará lo que haga el script. Ejecutar otra instancia del script eliminará cualquier instancia existente del script.
Lo uso para mostrar un pequeño widget de calendario PyGTK que se ejecuta cuando hago clic en el reloj. Si hago clic y el calendario no está activo, se muestra el calendario. Si el calendario se está ejecutando y hago clic en el reloj, el calendario desaparece.
Usando el asombroso psutil
biblioteca es bastante simple:
p = psutil.Process(pid)
p.terminate() #or p.kill()
Si no desea instalar una nueva biblioteca, puede usar el os
módulo:
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
Véase también el os.kill
documentación.
Si está interesado en iniciar el comando python StripCore.py
si no se está ejecutando y, de lo contrario, lo mata, puede usar psutil
para hacer esto de manera confiable.
Algo como:
import psutil
from subprocess import Popen
for process in psutil.process_iter():
if process.cmdline() == ['python', 'StripCore.py']:
print('Process found. Terminating it.')
process.terminate()
break
else:
print('Process not found: starting it.')
Popen(['python', 'StripCore.py'])
Ejecución de muestra:
$python test_strip.py #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py
Process found. Terminating it.
$python test_strip.py
Process not found: starting it.
$killall python
$python test_strip.py
Process not found: starting it.
$python test_strip.py
Process found. Terminating it.
$python test_strip.py
Process not found: starting it.
Nota :En el anterior psutil
versiones cmdline
era un atributo en lugar de un método.