Hallo!
Ich möchte gerne, dass mein Programm nur einmal (pro Benutzer) gestartet wird, und dass wenn der Benutzer versucht, das Programm zu starten, während es läuft, die bereits laufende Instanz das bemerkt und die commandlineargs dieses Startversuchs erfährt.
gibt es dafür eine (möglichst systemunabhängige) Lösung innerhalb Pythons?
Programm Starten, wenn es bereits Läuft, informieren
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Mmh, das einfachste ist wahrscheinlich, wenn dein Programm beim Start eine bestimmte Datei anlegt und beim Beenden wieder loescht. Existiert diese Datei schon, weiss dein Programm, dass das gleiche Programm schon laeuft.
- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
Und jetzt wird dein Programm unerwartet beendet, datei wird nicht gelöscht, und user nervt sich^^ evtl kannst du nach einem gewissen Prozess namen suchen...
vermutlich wäre es dann besser, nicht zu überprüfen, ob sie existiert, sondern sich einen lock zu holen,
das löst aber noch nicht das Problem, dass das bereits laufende Programm informiert werden soll, und es wäre nicht mehr OS-Unabhängig.
das löst aber noch nicht das Problem, dass das bereits laufende Programm informiert werden soll, und es wäre nicht mehr OS-Unabhängig.
So wie es aussieht, hab ich eine eine Lösung mit pyGTK gefunden:
http://www.pygtk.org/pygtk2tutorial/sec ... ckets.html
http://www.pygtk.org/pygtk2tutorial/sec ... ckets.html
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Ja, ich erinnere mich an eine alte Netscapeversion unter Unix, die sich hin und wieder aufhing, und danach musste mann irgend eine lock-Datei per Hand loeschen... Aber eigentlich bringt Python bringt doch genug Moeglichkeiten mit, Programmabbrueche und Exceptions abzufangen:DatenMetzgerX hat geschrieben:Und jetzt wird dein Programm unerwartet beendet, datei wird nicht gelöscht, und user nervt sich^^.
Code: Alles auswählen
#!/usr/bin/env python
import atexit;
import time;
import signal;
import sys;
def on_exit():
print "Received exit"
def on_signal(signum, frame):
print "Received signal", signum
sys.exit(0);
atexit.register(on_exit);
signal.signal(signal.SIGTERM, on_signal);
while True:
print "Running..."
time.sleep(1)
...was aber auch wieder betriebssystemabhaengig ist. Ausserdem ist der Programmname bei mir (Linux) immer der Name des interpreters (also Python), man muss also schon die aufrufende Zeile haben. Ist unter Linux auch nicht das Problem (wenn das Proc-Verzeichnis existiert), aber eben auch nicht so ganz straight forward.DatenMetzgerX hat geschrieben:evtl kannst du nach einem gewissen Prozess namen suchen...
Bei diesen Thema könnt ihr OS Unabhängigkeit komplett vergessen.
Unter windows: Messagepump mit WM-Handler verwenden.
Unter *Nix: Signalhandler verwenden.
Unter Windows erfordert das ganze keine PID, da WM's von allen Prozessen zugreifbar sind.
Unter *Nix brauchst du allerdings die PID um ein Signal dahin zu senden.
Der laufende Prozess muss dann im jeweiligen Handler eine aktion definieren, z.b. sich selbst beenden.
Unter windows: Messagepump mit WM-Handler verwenden.
Unter *Nix: Signalhandler verwenden.
Unter Windows erfordert das ganze keine PID, da WM's von allen Prozessen zugreifbar sind.
Unter *Nix brauchst du allerdings die PID um ein Signal dahin zu senden.
Der laufende Prozess muss dann im jeweiligen Handler eine aktion definieren, z.b. sich selbst beenden.
Ich habe noch eine Frage zu diesem Punkt...
wie bekomme ich es hin das es auch bei Threads funktioniert.
Das geht nämlich ned:
was besonderes muss ich dabei beachten ?
Thonix
wie bekomme ich es hin das es auch bei Threads funktioniert.
Das geht nämlich ned:
Code: Alles auswählen
#!/usr/bin/python
import atexit;
import time;
import signal;
import sys;
import os;
import threading;
def on_exit():
print "Received exit"
def on_signal(signum, frame):
print "Received signal", signum
sys.exit(0);
atexit.register(on_exit);
signal.signal(signal.SIGTERM, on_signal);
class th1 ( threading.Thread ) :
def __init__(self, name="CheckDisk") :
"""
Constructor, setting initial variables
"""
threading.Thread.__init__(self, name=name)
def run(self):
while True:
print "Running..." + str(os.getpid())
time.sleep(1)
th = th1 ("call")
th.start()
Thonix
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wie wärs mit PEP8, den Python Stylequide?thonix hat geschrieben:was besonderes muss ich dabei beachten ?
Aber sonst ist dein Problem ziemlich interessant, das Programm konnte ich nur mit einem SIGKILL beenden. run() wird scheinbar nie verlassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Mmh, sobald in Zeile 19 ein Signal registriert ist, scheint dieses Signal ignoriert zu werden. Kommentiere ich die Zeile aus, kann ich dem Prozess auch wieder ein SIGTERM schicken.
Aber nach meinem Verstaendnis hat thonix alles richtig gemacht.
Python-Doku hat geschrieben:Some care must be taken if both signals and threads are used in the same program. The fundamental thing to remember in using signals and threads simultaneously is: always perform signal() operations in the main thread of execution. Any thread can perform an alarm(), getsignal(), or pause(); only the main thread can set a new signal handler, and the main thread will be the only one to receive signals (this is enforced by the Python signal module, even if the underlying thread implementation supports sending signals to individual threads). This means that signals can't be used as a means of inter-thread communication. Use locks instead.
Aber nach meinem Verstaendnis hat thonix alles richtig gemacht.
- MoR4euZ
- User
- Beiträge: 34
- Registriert: Mittwoch 18. Oktober 2006, 21:21
- Wohnort: Essen
- Kontaktdaten:
ohje was lese ich den hier
kann man mit python keine processe starten oder stopen?
braucht man zwingend eine sprache die mit exceptions umgehen kann?
ich würde gerne mal eine gamestatistik wie bei xfire (www.de.xfire.com) coden
wie könnte man sowas am besten umsetzten?
nicht mit python oder?
fragen über fragen sorry
[EDIT]
jap sorry hast recht
http://www.python-forum.de/viewtopic.php?p=47003#47003
[/EDIT]
kann man mit python keine processe starten oder stopen?
braucht man zwingend eine sprache die mit exceptions umgehen kann?
ich würde gerne mal eine gamestatistik wie bei xfire (www.de.xfire.com) coden
wie könnte man sowas am besten umsetzten?
nicht mit python oder?
fragen über fragen sorry
[EDIT]
jap sorry hast recht
http://www.python-forum.de/viewtopic.php?p=47003#47003
[/EDIT]
Zuletzt geändert von MoR4euZ am Mittwoch 18. Oktober 2006, 21:56, insgesamt 2-mal geändert.
das geht hier um was ganz spezielles.
mach mal lieber einen neuen post, das passt besser...
mach mal lieber einen neuen post, das passt besser...
http://www.cs.unm.edu/~dlchao/flake/doom/
Einen Beitrag im deutschen Python-Forum.MoR4euZ hat geschrieben:ohje was lese ich den hier
Doch das kann man mit Python machen.kann man mit python keine processe starten oder stopen?
Braucht man nicht zwingend, macht aber einiges einfacher. Python kennt ja netterweise Ausnahmen, also kann man sie auch benutzen.braucht man zwingend eine sprache die mit exceptions umgehen kann?
ich würde gerne mal eine gamestatistik wie bei xfire (www.de.xfire.com) coden
Code: Alles auswählen
An error occurred while loading http://www.de.xfire.com:
Unknown host www.de.xfire.com
Was umsetzen? Eine nichtexistente Domain? Das geht in keiner Programmiersprache, das ist eine Frage von Domainregistrierung und Webserverkonfiguration.wie könnte man sowas am besten umsetzten?
nicht mit python oder?