2014-01-11 3 views
6

Я хочу убить процесс из другой функции в классе, участвуя в том, что он был инициирован другой функцией. Вот пример:Как убить подпроцесс, инициированный другой функцией в том же классе

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() 

Как определить foo_stop?

ответ

2

jterrace код работает. Если вы не хотите, чтобы он запускался при инициализации, просто вызовите Popen в отдельной функции и ничего не передайте функции init.

import subprocess 
import time 

class foo_class(object): 
    def __init__(self): 
     pass 

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

    def stop(self): 
     self.foo.kill() 
     self.foo.wait() #don't know if this is necessary? 

    def restart(self): 
     self.start() 


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

УДИВИТЕЛЬНЫЙ! Благодарю. Спасибо всем, кто ответил – user3184086

2

Я предполагаю, что Вы хотите что-то вроде этого:

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() 

Некоторые вещи, которые я изменил:

  • Импорт обычно должен идти в верхней части файла.
  • Классы должны наследовать от object.
  • Вы хотите использовать instance variable.
  • Это не имеет смысла для имен методов вашего класса, начинающихся с имени класса.
  • При вызове его методов вы создавали новый экземпляр из foo_class. Вместо этого вы хотите создать один экземпляр и называть методы на нем.
+0

Спасибо, jterrace, но не совсем. Я хочу запустить службу с помощью функции start и убить ее с помощью функции stop. Таким образом, я начал бы процесс в классе __init__, и я не хочу этого делать (класс имеет множество функций). – user3184086

+0

Почему бы вам не добавить метод .wait() к классу init, поэтому его self.foo = subproces.Popen (['a daemon']) wait() Таким образом, вы не начнете, пока не будете явно называть это метод – jwillis0720

+0

Несомненно, легко исправить, изменить только для создания процесса при запуске. – jterrace

Смежные вопросы