2010-06-08 280 views
3

我需要一些python服務的幫助。將參數傳遞給python服務

我有一個用Python編寫的服務。我需要做的是傳遞一些論據。讓我給你一個例子來解釋它好一點。

可以說我有一個服務,它什麼都不做,只是寫了一些東西給日誌。我想多次將相同的東西寫入日誌中,所以我使用循環。當我開始服務時,我想通過櫃檯循環,但我不知道如何。我開始與服務:

win32serviceutil.HandleCommandLine(WinService) 

我正在尋找類似

win32serviceutil.HandleCommandLine(WinService,10) 

我真的不關心它怎麼做,只要我可以傳遞參數給它。一直試圖讓這一天在沒有運氣的情況下在更好的一天工作。此外,該服務不是直接運行,而是導入並從那裏運行。

編輯:

這裏是一個例子,希望它會清除一些事情。

這是WindowsService.py:

import win32serviceutil, win32service, win32event, servicemanager, win32serviceutil 

class LoopService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "LoopService" 
    _svc_description_ = "LoopService" 
    _svc_display_name_ = "LoopService" 

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

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

    def SvcDoRun(self): 
     i = 0; 
     while i < 5: 
      servicemanager.LogInfoMsg("just something to put in the log"); 
      i += 1 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

這是在主腳本:

import service.WindowsService, win32serviceutil 
win32serviceutil.HandleCommandLine(service.WindowsService.LoopService); 

由於它是目前,循環將執行次數固定量。我想只是簡單地將價值發送到服務。真的不在乎如何。

回答

0

對不起,沒有足夠的信息來回答你的問題。這似乎是特定於應用程序的事情。

我能想到的唯一事情就是查看win32serviceutil.HandleCommandLine方法和WinService類的代碼,以確定哪一個寫入日誌。然後,您必須創建一個子類並重寫負責在日誌中寫入以接收額外參數的方法。最後,你必須將原始類的所有引用都機會到新的類。

- 在問題編輯後添加。

更清晰,但仍然不足。您需要查看win32serviceutil.HandleCommandLine並查看它如何調用service.WindowsService.LoopService .__ init__。特別是,如何HandleCommandLine生成參數以及如何控制它。

如果你趕時間,你可以這樣做:

class LoopService(win32serviceutil.ServiceFramework): 
    repetitions = 5 
    # ... 

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

    # ... 

    def SvcDoRun(self): 
     for i in range(self.repetitions): 
      servicemanager.LogInfoMsg("just something to put in the log"); 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

然後你就可以控制重複的次數改變LoopService.repetitions 之前創建一個新的實例。

import service.WindowsService, win32serviceutil 
service.WindowsService.LoopService.repetitions = 10 
win32serviceutil.HandleCommandLine(service.WindowsService.LoopService); 

這是有效的,但它很醜。嘗試控制參數,然後相應地設置self.repetition

+0

我編輯了我的帖子,以包含一個希望給出更多信息的例子。 – Grim 2010-06-09 00:16:49

0

我不認爲你可以直接將參數傳遞給服務。您可以使用環境(在啓動服務之前設置環境變量並從服務中讀取它)。