Programm Kontrolle

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.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ok, wenn ich das richtige Paket habe, sollte es 'python-lockfile' sein.
Das habe ich installiert.

Mal schauen, wie es jetzt weiter geht!

Hmm ... und dann verließen sie ihn ... :K
deets

Nö, das Paket heißt abl.util. Aber wenn Python-lockfile existiert, dann tut das vll was ähnliches. Doku lesen, sollte ja mitinstalliert sein oder seinbar.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Das Paket abl.util ist in Kubuntu 12.04 nicht vorhanden.

Code: Alles auswählen

print lockfile.__doc__
gibt dies aus:
lockfile.py - Platform-independent advisory file locks.

Requires Python 2.5 unless you apply 2.4.diff
Locking is done on a per-thread basis instead of a per-process basis.

Usage:

>>> lock = FileLock('somefile')
>>> try:
... lock.acquire()
... except AlreadyLocked:
... print 'somefile', 'is locked already.'
... except LockFailed:
... print 'somefile', 'can\'t be locked.'
... else:
... print 'got lock'
got lock
>>> print lock.is_locked()
True
>>> lock.release()

>>> lock = FileLock('somefile')
>>> print lock.is_locked()
False
>>> with lock:
... print lock.is_locked()
True
>>> print lock.is_locked()
False
>>> # It is okay to lock twice from the same thread...
>>> with lock:
... lock.acquire()
...
>>> # Though no counter is kept, so you can't unlock multiple times...
>>> print lock.is_locked()
False

Exceptions:

Error - base class for other exceptions
LockError - base class for all locking exceptions
AlreadyLocked - Another thread or process already holds the lock
LockFailed - Lock failed for some other reason
UnlockError - base class for all unlocking exceptions
AlreadyUnlocked - File was not locked.
NotMyLock - File was locked but not by the current thread/process
Ich habe dies dann mal versucht umzusetzen.

Bei

Code: Alles auswählen

lock = FileLock('somefile')
habe ich dies

Code: Alles auswählen

lock = FileLock('/home/user/meinfile.py')
sowie

Code: Alles auswählen

lock = FileLock('meinfile.py')
gemacht, dabei kommt dann als Meldung
NameError: name 'FileLock' is not defined
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ein from lockfile import FileLock sollte Abhilfe schaffen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo jerch,
Danke für die Info, jetzt kommt keine Fehlermeldung mehr! :wink:

Dann kann ich mir mal dies genauer anschauen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Mit

Code: Alles auswählen

from lockfile import FileLock, AlreadyLocked, LockFailed

PROGRAMM = 'meinProgramm.py'

lock = FileLock(PROGRAMM)
try:
    lock.acquire()
except AlreadyLocked:
    print PROGRAMM, 'is locked already.'
except LockFailed:
    print PROGRAMM, 'can\'t be locked.'
else:
    print 'got lock'
kann ich das Programm sperren, so daß kein weiterer Programmstart möglich ist.

Und mit

Code: Alles auswählen

lock.release()
gebe ich das Programm wieder frei, vermute ich mal.

PS Nachtrag:
Beim weiteren Testen habe ich festgestellt, daß doch weitere Programmstartś möglich sind.
Da werde ich wohl noch etwas brauchen, bis ich das richtig anwenden kann ...
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen

lockfile, kann ich aus jetziger Sicht nicht für mein zu startendes Programm nehmen, da ich nicht weiß wie ich anschließend das gesperrte Programm wieder direkt beenden kann. Vielleicht ist dies auch damit möglich, aber die Infos für lockfile sind doch recht mager und für mich daher dann um so schwieriger. :?

Ich habe dann bei meiner alten Version der Startkontrolle weiter gemacht, die jetzt einsatzbereit, prima funktioniert und sehr einfach in andere Programme integriert werden kann.
Ich poste nun Euch mal mit der Gefahr, für Euch als "hoffnungslos" zu gelten, die verschiedenen Module.

Dieser Eintrag befindet sich am Anfang, des zu startenden Programms.

Code: Alles auswählen

### Programm-Start und -Kontrolle ###
def startcontrol():
    '''
    Einstiegsfunktion beim Programmstart.
    Es startet das Modul prog_control, das als Kontrollfunktion
    für das Starten und Beenden des Programms dient.
    '''

    start = 'prog_control.py'

    path = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
    subprocess.Popen(['python', '{}/{}'.format(path, start)],)
startcontrol()
Als nächstes das Modul prog_control.py, das die Abläufe steuert.
https://gist.github.com/3005223#file_prog_control.py

Als nächstes das Modul gui_start.py, das beim Programmstart für das Dialo-Fenster verantwortlich ist.
https://gist.github.com/3005223#file_gui_start.py

Als nächstes kommt dann noch das Modul gui_break.py, das für das Info-Fenster bei Abbruch verantwortlich ist.
https://gist.github.com/3005223#file_gui_break.py

Zum Schluß noch prog_param.py, hier sind alle Parameter zentral hinterlegt.
https://gist.github.com/3005223#file_prog_param.py
und wird mit 'from prog_param import MeinParameter, MeinAndererParameter, usw.' in den jeweiligen Modulen aufgerufen, die dann dort verwendet werden können. :D

Ob Kopfschütteln oder hoffnungslos, ich bin damit vorerst sehr zufrieden! :wink:
Zuletzt geändert von Nobuddy am Donnerstag 28. Juni 2012, 07:27, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nur mal so als Frage: Was sprach denn gegen das von ddets empfohlene `abl.util`? Damit wäre so ein Locking in zwei Zeilen zu lösen, wenn ich das richtig im Code gesehen habe "damals"...

Ansonsten: Bitte poste so langen und vielen Code doch in einem Pastebin. gist.github.com erlaubt sogar das anlegen eines Gists für viele Dateien, also quasi genau so, wie Du sie jetzt auch hier reingestellt hast.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich habe das mal mit gist.github.com versucht und habe hier die Public Clone URL: [url]git://gist.github.com/3005223.git[/url]
Habe das bei gist.github.com vorher noch nicht praktiziert, hoffe aber es funktioniert mit der Public Clone URL.
Oder vielleicht dies https://gist.github.com/3005223.js

Gegen das von deets empfohlene `abl.util` spricht nichts, komme aber einfach nicht mit klar und weiß auch nicht, wie dies eingesetzt wird und wie es funktioniert. Aus der vorhanden Doku, kann ich das auch nicht entnehmen. Die Lösung in zwei Zeilen gegen mein 'Monstrum', keine Frage ... :K

Ich habe wieder ein bisschen mehr dazu gelernt, in dem ich mich mehr mit den Beschreibungen der gängigen Modulen befasst habe. Vieles was ich vorher noch wesentlich umständlicher gemacht hätte, habe ich jetzt schon reduziert ... :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nobuddy hat geschrieben:Ich habe das mal mit gist.github.com versucht und habe hier die Public Clone URL: [url]git://gist.github.com/3005223.git[/url]
Habe das bei gist.github.com vorher noch nicht praktiziert, hoffe aber es funktioniert mit der Public Clone URL.
Oder vielleicht dies https://gist.github.com/3005223.js
Einfach den Link posten, dann kann man entscheiden ob man das clonen will oder nur im Browser anschaut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ok, habe meinen obigen Beitrag nochmals editiert und statt dem Code, Links hinein gestellt.
Antworten