2012-01-20 19 views
16

我試圖啓動一個簡單的服務例如:無法啓動用Python編寫的(win32serviceutil)Windows服務

someservice.py:

import win32serviceutil 
import win32service 
import win32event 

class SmallestPythonService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "SmallestPythonService" 
    _svc_display_name_ = "display service" 

    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): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

if __name__=='__main__': 
    win32serviceutil.HandleCommandLine(SmallestPythonService) 

當我運行

python someservice.py install 

一切都很好,服務出現在Windows服務列表中,但

python someservice.py start 

失敗「錯誤1053:服務沒有及時啓動或控制請求」,但沒有任何延遲。

我使用了一個解決方案,它說當pythonservice.exe找不到python27.dll時發生。它實際上無法將C:\Python27添加到PATH。現在pythonservice.exe運行正常,但錯誤1053仍然存在。

我在Windows 7旗艦版上運行的Python 2.7.2與pywin32 216與管理privilegies。

+0

這個工作對我來說,運行的Python 2.6.6(64位)和pywin32 216 AMD64的py26。我意識到這不是很有幫助。在Windows 7 Pro上。 – jgritty

+3

+1提的是,錯誤發生1053'如果能pythonservice.exe'找不到'python27.dll'。永遠讓我永遠解決這個問題!謝謝:) – Gili

回答

3

我相信你的問題將通過如果你從

def SvcDoRun(self): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

改變方法SvcDoRun

def SvcDoRun(self): 
     self.ReportServiceStatus(win32service.SERVICE_RUNNING) 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
9

另外,感謝指出這可能是一個DLL問題這導致我找到了正確的解決方案。

您需要做的是將Python27添加到SYSTEM PATH,而不是添加到USER PATH,因爲默認情況下,python服務將作爲「LocalSystem」安裝,因此當它嘗試啓動時使用SYSTEM PATH變量 - 這就是爲什麼你可以從命令提示符運行它,你的USER PATH是正確的。

希望它有幫助!

+5

它可能在這種情況下證明是有益的也是這些目錄添加到您的系統路徑:'C:\ Python27 \ LIB \站點包\ win32'和'C:\ Python27 \ LIB \站點包\ pywin32_system32' 。這將讓你更容易地使用pythonservice。 – BuvinJ

+0

@BuvinJ這使用PythonService.exe修復了我的錯誤1053。謝謝! – Kenneth

+0

@mpaf你能幫助描述如何添加東西到系統路徑?我看到,只需將它添加到「系統控制面板」中的整個計算機系統路徑即可。我個人不得不添加anaconda,如https://www.snip2code.com/Snippet/770602/setup-python-script-as-windows-service –

1

另一個有用的技巧是添加以下行

sys.frozen = 'windows_exe' # Fake py2exe so we can debug

你叫

win32serviceutil.HandleCommandLine(...)

之前,這樣你可以得到什麼不順心的服務更多有用的信息。