2014-01-11 57 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在一個單獨的功能,並沒有傳遞到初始化函數

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,但不完全是。我想用啓動功能啓動服務並使用停止功能殺死它。這樣我就可以在類__init__上啓動這個過程,我不想這樣做(該類有更多的函數)。 – user3184086

+0

爲什麼不添加.wait()方法到init類,因此它的self.foo = subproces.Popen(['守護進程'])。wait()這樣,直到你明確地調用方法 – jwillis0720

+0

當然,易於修復,修改爲只在啓動時創建過程。 – jterrace