Überprüfen ob Anwendung vorhanden

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.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

snafu hat geschrieben:`.kill()` erscheint mir ziemlich unsinnig, wenn `.wait()` doch bereits den Returncode zurück gegeben hat. Denn wenn dieser Code abgefragt werden kann, ist das Programm bereits beendet.
Laut Doku für .wait() das einen Popen.returncode zurückgibt:
A None value indicates that the process hasn’t terminated yet
Anscheinend ist es also nicht so, dass das Programm aufjedenfall beendet worden ist, oder seh ich da was anderes?

Wie gesagt, in meinem spezifischen Fall haben Programme, die keine Parameter übergeben bekommen, keine Wirkung.

Grüße,
anogayales
BlackJack

@anogayales: Überleg mal was `wait()` auf deutsch heisst und was das wohl bedeuten mag…
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Ja, du hast doch selbst gesagt, dass ich den Status abfragen muss. Mir ist schon klar, das wait wartet bis der Kindsprocess terminiert ist. Deswegen ja die Anmerkung von snafu. Was bringt mir also der Returncode in Verbindung mit wait()? Brauch ich den dann überhaupt?

@BlackJack:
Wie finde ich nun diese Zombieprozesse und wie terminier ich die?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

BlackJack hat geschrieben:@anogayales: Prozesse haben einen numerischen Rückgabewert wenn das Programm beendet ist. Den bekommt man mit der `wait()`-Methode. Wenn man diesen Wert nicht abfragt, dann kann das Betriebssystem den Prozess nicht aus der Prozessliste entfernen. Diese "toten" aber noch existierenden Prozesse nennt man Zombies.
Weil das evtl nicht ganz rueberkommt: Zombies haben schon terminiert. Der Rest steht im Quote.
BlackJack

@anogayales: Den Return-Code brauchst Du nicht, aber Du musst ihn halt "abholen", damit das Betriebssystem die Ressoucen von dem Prozess freigeben kann. Und das macht man mit `wait()`. Zombie-Prozesse musst Du nicht suchen und finden sondern dafür sorgen das sie nicht entstehen – eben zum Beispiel in dem Du `wait()` aufrufst.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Alles klar! Vielen Dank für die Infos!
Mein Code sieht nun so aus, unter der Annahme das beim Programmaufruf keine Seiteneffekte enstehen:

Code: Alles auswählen

def programme_available(programme_name):
    process = None
    
    try:
        process = subprocess.Popen(programme_name)
    except OSError as why:
        if why.errno == errno.ENOENT:
            return False

    if process is not None:
       process.wait()

    return True
Grüße,
anogayales
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mein Vorschlag:

Code: Alles auswählen

def have_program(name):
    try:
        subprocess.call(name)
        return True
    except OSError as error:
        if not error.errno == errno.ENOENT:
            raise error
        return False
Wobei man natürlich die Ausgabeströme sicher ins Nirvana leiten möchte.
Antworten