2008-11-04 11 views
11

Tôi hiện đang cố gắng tạo dịch vụ win32 bằng pywin32. điểm chính của tôi về tài liệu tham khảo đã được hướng dẫn này:Tạo dịch vụ python win32

http://code.activestate.com/recipes/551780/

gì tôi không hiểu quá trình khởi là, kể từ khi Daemon không bao giờ được khởi tạo trực tiếp bởi Daemon(), thay vì từ sự hiểu biết của tôi nó khởi tạo bởi sau:

mydaemon = Daemon 
__svc_regClass__(mydaemon, "foo", "foo display", "foo description") 
__svc_install__(mydaemon) 

đâu svc_install, xử lý các initalization, bằng cách gọi Daemon. init() và chuyển một số đối số cho nó.

Nhưng làm thế nào tôi có thể khởi tạo đối tượng daemon, mà không cần kích thích dịch vụ? Tôi muốn làm một vài điều, trước khi tôi bắt đầu dịch vụ. Có ai có ý tưởng nào?

class Daemon(win32serviceutil.ServiceFramework): 
    def __init__(self, args): 
     win32serviceutil.ServiceFramework.__init__(self, args) 
     self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 

    def SvcDoRun(self): 
     self.run() 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.hWaitStop) 

    def start(self): 
     pass 

    def stop(self): 
     self.SvcStop() 

    def run(self): 
     pass 

def __svc_install__(cls): 
    win32api.SetConsoleCtrlHandler(lambda x: True, True) 
    try: 
     win32serviceutil.InstallService(
      cls._svc_reg_class_, 
      cls._svc_name_, 
      cls._svc_display_name_, 
      startType = win32service.SERVICE_AUTO_START 
      ) 
     print "Installed" 
    except Exception, err: 
     print str(err) 

def __svc_regClass__(cls, name, display_name, description): 

    #Bind the values to the service name 
    cls._svc_name_ = name 
    cls._svc_display_name_ = display_name 
    cls._svc_description_ = description 
    try: 
     module_path = sys.modules[cls.__module__].__file__ 
    except AttributeError: 
     from sys import executable 
     module_path = executable 
    module_file = os.path.splitext(os.path.abspath(module_path))[0] 
    cls._svc_reg_class_ = '%s.%s' % (module_file, cls.__name__) 
+0

Tôi không chắc mình có hiểu câu hỏi hay không. Bạn có thể cho chúng tôi một ví dụ về những gì bạn muốn làm rằng mã trên không cho phép? –

Trả lời

8

tôi chỉ cần tạo một đơn giản "làm thế nào để", nơi chương trình là trong một mô-đun và các dịch vụ là ở nơi khác, nó sử dụng py2exe để tạo ra các win32 dịch vụ, mà tôi tin là tốt nhất bạn có thể làm cho người dùng của bạn mà không muốn gây rối với trình thông dịch python hoặc các phụ thuộc khác.

Bạn có thể xem hướng dẫn của tôi tại đây: Create win32 services using Python and py2exe

+0

Thats một hướng dẫn tuyệt vời, đọc nó một chút và có thêm một vài ý tưởng, tôi sẽ thực sự quay lại và triển khai chúng. Fyi. Các định dạng của mã là khá sai lầm trong firefox: ( – UberJumper

+0

@uberjumper: Vui mừng khi đọc mà bạn thích nó. Tôi đang kiểm tra lý do tại sao mã trông bị rối. – markuz

+3

Liên kết đã chết – filmor