Exe mit cx-freeze - Verhindern eines Mehrfachaufrufs

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rumpie
User
Beiträge: 11
Registriert: Montag 17. August 2009, 14:25

Hallo Forum,

Betrifft Windows-Umgebung(en):

ich habe aus meinen Pythonskripten eine Anwendung mit cx-Freeze erstellt.
Es funktioniert alles soweit prima, aber die erstellte ausführbare Datei kann mehrfach aufgerufen werden (kann mehrere Instanzen bilden).

Gibt es eine Möglichkeit, dass der erfolgreiche Aufruf der exe-Datei nur möglich ist, wenn diese exe-Datei noch nicht aktiviert wurde?

Vielen Dank im voraus für die Bemühungen.
rumpie
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Mehrere Möglichkeiten:
1. Du mußt einfach am Anfang Deines Programms die Prozessliste nach Deinem Programm selbst durchsuchen.
2. Einen globalen Eventhook installieren und beim Programmstart prüfen ob jemand auf dieses Event reagiert.
3. Den Anwender in den AGBs mit einer Konventionalstrafe drohen, falls er das Programm zweimal startet.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich denke, die übliche Art, dieses "Problem" zu lösen ist, nach dem Start eine Lockdatei anzulegen, wenn sie noch nicht existiert bzw. das Programm sofort zu beenden, wenn solch eine Lockdatei existiert. Problem in Anführungszeichen, weil ich generell kein Problem darin sehe, wenn es mehr als eine Instanz von einem Programm geben kann.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich habe das gefunden, was auf http://code.google.com/p/psutil/ verweist. Ich hätte jetzt gedacht eine temporäre Datei anzulegen und jeweils beim Programmstart zu schauen, ob sie bereits existiert, aber das ist sicher der Laien-Ansatz. Das mit den Prozessen klingt schon sinnvoll.

Wenn ich das os-Modul richtig verstehe, dann kann ich Prozess-IDs erfragen, aber ich sehe gerade keinen Weg die Liste aller Prozesse zu bekommen oder stehe ich auf dem Schlauch???

@derdon: zur Lockdatei - Ich hatte meinen Beitrag gepostet, bevor ich deinen Beitrag las. Kann so eine Datei nicht "verlorengehen", z. B. bei Aufräumarbeiten und wäre der Ansatz über Prozessliste nicht sauberer??? (Frage ich als Laie)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

pixewakb hat geschrieben:Kann so eine Datei nicht "verlorengehen", z. B. bei Aufräumarbeiten und wäre der Ansatz über Prozessliste nicht sauberer??? (Frage ich als Laie)
Andersherum geht auch: Die Datei kann bei einem Programmabsturz uebrig bleiben. Insofern halte ich den Prozessansatz nicht nur fuer sauberer, sondern fuer den richtigen Weg - man muss nur aufpassen, dass man auch die eigene ID vorher herausfiltert ;)

So eine Ueberpruefung kann durchaus seine Berechtigung haben, wenn ein Programm zB auf bestimmten Daten arbeitet - ich denke da an meinen Feedreader - oder dass der Benutzer meist keinen neuen Prozess sondern zB einen neuen Tab aufmachen will - ich denke da an Browser und HTML Dateien, die ich aus dem Filemanager oeffne.

Ich bin mir aber sicher, dass es zu dem Thema schon ein paar Threads gibt, einfach mal die Suche anwerfen.
rumpie
User
Beiträge: 11
Registriert: Montag 17. August 2009, 14:25

Hallo Forum,

vielen Dank für die Antworten und die Hilfe.

Mit der Nutzung von psutil und der Auswertung der Prozessliste habe ich genau die Information, welche ich brauchte zum Verarbeiten..

Thema ist damit für mich als "erledigt markiert"

Viele Grüße
rumpie
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Nachfrage an alle, nicht an den Thread-Starter: Das Modul os oder sys bietet keine Option die Prozessliste zu lesen? Ich habe heute bei os gesucht und fand sachen, um die Prozess-id zu finden, aber nichts, was nach einer Liste aussah.

Also meine Frage: In den Standardmodulen gibt es keine Möglichkeit die Aufgabe zu lösen?
BlackJack

@pixewakb: Nicht direkt. Du kannst unter Linux natürlich selber das ``/proc/``-Dateisystem verarbeiten oder unter Windows mit `ctypes` die entsprechenden Systemaufrufe absetzen. Also Dir ein eigenes `psutil`-Modul schreiben. :-)
Antworten