subprocess beenden

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
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

hallo,

nach erfolglosen recherchen, hoffe ich auf einen tip für folgendes dilema:
habe ein programm, dass bisher mühelos funktioniert hat, wenn es über subprocess.popen mehrere dateien in einem externen programm öffnen und über das python.script schließen sollte.
das funktioniert, solange es unter der version 2.6. läuft.
das selbe programm soll nun auch unter der py-version 2.4 lauffähig sein.
die dateien öffnen sich nach wie vor, klappt nur schließen kann ich sie nicht mehr.
code zum öffnen:

Code: Alles auswählen

def openGhost(self, event):
      tmp = self.selectedFilesList.GetItems()
      root = ''

      for t in tmp:
          if t.startswith('/'):
              root = t
          if t.startswith('-> '):
              proc = subprocess.Popen(['gv','-swap',root + '/' + t[3:]])
              self.procs.append(proc)
code zum schließen:

Code: Alles auswählen

def ExitallGhost(self, event):
        ret = wx.MessageBox('blabla..', wx.YES_NO | wx.CENTRE |wx.YES_DEFAULT, self)
        if ret == wx.YES:
            while len(self.procs) > 0:
                self.proc = self.procs.pop()
                self.proc.send_signal(15)
        event.Skip()
wenn ich dasselbe in version 2.4 anwende, erhalte ich eine fehlermeldung: AttributeError: 'Popen' object has no attribute 'send_signal'
hat jemand einen tip?
danke
sara55
BlackJack

@sara55: In Python 2.4 haben `subprocess.Popen`-Exemplare die `send_signal()`-Methode noch nicht. Da wirst Du mit `os.kill()` und dem `signal`-Modul arbeiten müssen. Die sind allerdings nur auf "unixoiden" Systemen vorhanden.

Noch zwei Anmerkungen zum Quelltext: 1. Pfade setzt man besser mit `os.path.join()` zusammen.

2. Anstelle der ``while``-Schleife in `ExitallGhost()` hätte ich eine ``for``-Schleife verwendet.
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

hi, danke für die antwort.
das war mir klar, dass es die methode nicht gibt in 2.4.
wusste (und weiss) nur nicht, wie ich das os.kill() in den vorgegbenen code einsetzen soll, dass es auch funktioniert (deswegen der code-ausschnitt)..soll auf centos laufen, da gehts nur mit der 2.4. version.
danke für die tips
gruß
BlackJack

@sara55: Du musst halt `os.kill()` zum senden des Signals an den Prozess verwenden. Wo ist da jetzt das Problem? Liess Dir die Doku zu `os.kill()` durch was das als Argumente braucht, schau Dir die Doku zu `subprocess.Popen` an, was es da so alles gibt, und verbinde das Wissen zu einem Aufruf. Die Dokumentation von älteren Python-Versionen findet man auch auf http://docs.python.org/
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

jep, gelesen und probiert..
habe den code so geändert:

Code: Alles auswählen

def ExitallGhost(self, event):
        ret = wx.MessageBox('blabla.., 'Quit all GV', wx.YES_NO | wx.CENTRE |wx.YES_DEFAULT, self)
        if ret == wx.YES:
            while len(self.procs) > 0:
                self.proc = self.procs.pop()
                self.pid = os.fork()
                os.kill(-self.pid,signal.SIGTERM)
            event.Skip()
problem nun: es schließen sich nicht nur die externen files, sondern python komplett..soll ja nich so sein
:roll:
BlackJack

@sara55: Wie kommst Du denn darauf bei einem Stück Code das einen bereits laufenden Prozess *beenden* soll, einen *neuen* mit `os.fork()` zu *starten*!?

Und warum bindest Du `proc` und `pid` an das Objekt?
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

ok, os.fork() war sinnlos.
einiges mit os.kill(proc.pid,signal.SIGTERM) und os.kill(pid,signal.SIGKILL) rumprobiert. produziere nur diverse fehlermeldungen..
lunar

@sara55: Diese Fehlermeldung, sollen wir die nun erraten? Zeige doch bitte den Quelltext samt exakter, dazugehöriger Fehlermeldung ... ansonsten kann man Dir schwerlich weiterhelfen.
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

sorry.
problem gelöst.

Code: Alles auswählen

while len(self.procs) > 0:
proc = self.procs.pop()
os.kill(proc.pid, signal.SIGQUIT)
danke für die tips an BlackJack
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sara55 hat geschrieben:problem gelöst.

Code: Alles auswählen

while len(self.procs) > 0:
proc = self.procs.pop()
os.kill(proc.pid, signal.SIGQUIT)
Mit dem Code kann das Problem nicht gelöst sein. Da fehlen Einrückungen.
sara55
User
Beiträge: 6
Registriert: Samstag 2. Oktober 2010, 23:52

ist aber gelöst und funktioniert.
habs nur nochmal getippt, im script ist alles richtig eingerückt:

Code: Alles auswählen

def ExitallGhost(self, event):
        ret = wx.MessageBox('Sure you want...', 'Quit all GV', wx.YES_NO | wx.CENTRE |wx.YES_DEFAULT, self)
        if ret == wx.YES:
            while len(self.procs) > 0:
                proc = self.procs.pop()
                os.kill(proc.pid, signal.SIGQUIT)
        event.Skip()
:wink:
Antworten