Seite 1 von 1

subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 00:19
von sara55
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

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 06:15
von 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.

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 11:11
von sara55
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ß

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 11:39
von 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/

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 19:27
von sara55
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:

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 19:35
von 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?

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 22:16
von sara55
ok, os.fork() war sinnlos.
einiges mit os.kill(proc.pid,signal.SIGTERM) und os.kill(pid,signal.SIGKILL) rumprobiert. produziere nur diverse fehlermeldungen..

Re: subprocess beenden

Verfasst: Sonntag 3. Oktober 2010, 23:32
von 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.

Re: subprocess beenden

Verfasst: Montag 4. Oktober 2010, 14:26
von sara55
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

Re: subprocess beenden

Verfasst: Montag 4. Oktober 2010, 14:46
von /me
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.

Re: subprocess beenden

Verfasst: Montag 4. Oktober 2010, 14:58
von sara55
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: