Ich wollte dasselbe tun wie, aber ich wollte es in der einen Datei tun.
Die Logik wäre also:
- Wenn ein Skript mit meinem Namen läuft, beende es und beende es dann
- Wenn ein Skript mit meinem Namen nicht läuft, tu was
Ich habe die Antwort von Bakuriu geändert und mir Folgendes ausgedacht:
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...
Das Ausführen des Skripts wird das tun, was das Skript tut. Wenn Sie eine weitere Instanz des Skripts ausführen, wird jede vorhandene Instanz des Skripts beendet.
Ich verwende dies, um ein kleines PyGTK-Kalender-Widget anzuzeigen, das ausgeführt wird, wenn ich auf die Uhr klicke. Wenn ich klicke und der Kalender nicht aktiv ist, wird der Kalender angezeigt. Wenn der Kalender läuft und ich auf die Uhr klicke, verschwindet der Kalender.
Mit dem tollen psutil
Bibliothek ist es ziemlich einfach:
p = psutil.Process(pid)
p.terminate() #or p.kill()
Wenn Sie keine neue Bibliothek installieren möchten, können Sie die os
verwenden Modul:
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
Siehe auch os.kill
Dokumentation.
Wenn Sie daran interessiert sind, den Befehl python StripCore.py
zu starten wenn es nicht läuft, und es andernfalls beenden, können Sie psutil
verwenden um dies zuverlässig zu tun.
Etwas wie:
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'])
Beispiellauf:
$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.
Hinweis :Im vorherigen psutil
Versionen cmdline
war ein Attribut statt einer Methode.