2014-01-11 3 views
6

Ich möchte einen Prozess von einer anderen Funktion in der Klasse beenden, die darauf beruht, dass sie von einer anderen Funktion initiiert wurde. Hier ein Beispiel:Wie man einen Subprozess, der durch eine andere Funktion in der gleichen Klasse initiiert wurde, löscht

import time 

class foo_class: 
    global foo_global 
    def foo_start(self): 
     import subprocess 
     self.foo_global =subprocess.Popen(['a daemon service']) 

    def foo_stop(self): 
     self.foo_start.foo_global.kill() 
     self.foo_start.foo_global.wait() 


foo_class().foo_start() 
time.sleep(5) 
foo_class().foo_stop() 

Wie soll ich foo_stop definieren?

Antwort

2

Jterrace-Code funktioniert. Wenn Sie nicht möchten, dass es beim Initialisieren startet, rufen Sie Popen einfach in einer separaten Funktion auf und übergeben Sie nichts an die Init-Funktion.

+0

FANTASTISCH! Vielen Dank. Danke auch an alle, die geantwortet haben – user3184086

2

ich Ihnen raten möchte etwas wie folgt aus:

import subprocess 
import time 

class foo_class(object): 
    def __init__(self): 
     self.foo = None 

    def start(self): 
     self.stop() 
     self.foo = subprocess.Popen(['a daemon service']) 
     self.foo.start() 

    def stop(self): 
     if self.foo: 
      self.foo.kill() 
      self.foo.wait() 
      self.foo = None 


foo = foo_class() 
foo.start() 
time.sleep(5) 
foo.stop() 

Einige Dinge, die ich geändert:

  • Importe im Allgemeinen am Anfang der Datei zu gehen.
  • Klassen sollten von object erben.
  • Sie möchten ein instance variable verwenden.
  • Es macht nicht viel Sinn, dass die Methodennamen Ihrer Klasse mit dem Klassennamen beginnen.
  • Sie erstellten eine neue Instanz von foo_class beim Aufruf ihrer Methoden. Stattdessen möchten Sie eine einzelne Instanz erstellen und die Methoden aufrufen.
+0

Dank jterrace, aber nicht genau. Ich möchte den Dienst mit der Startfunktion starten und mit der Stoppfunktion beenden. Auf diese Weise würde ich den Prozess in der Klasse __init__ initiieren und ich möchte das nicht tun (die Klasse hat viele weitere Funktionen). – user3184086

+0

Warum fügst du der init-Klasse keine .wait() -Methode hinzu, so dass ihr self.foo = subproces.Popen (['ein Daemon']). Wait() Auf diese Weise wirst du erst starten, wenn du das explizit anrufst Methode – jwillis0720

+0

Sicher, einfache Lösung, modifiziert, um den Prozess nur beim Start zu erstellen. – jterrace

Verwandte Themen