2014-02-23 123 views
4

我想在python中編寫一個windows服務,但棘手的部分是我想將它部署在沒有python的機器上。 我已經成功創建了一個像this這樣的服務,如果我從我的機器上運行,它就可以工作。該問題開始時,我嘗試將其轉換爲exe,然後嘗試安裝它。 首先我試圖用cx_freeze服務例如,(看到here)中,setup.py是這樣的:作爲Windows服務的Python 3可執行文件

from cx_Freeze import setup, Executable 

options = {'build_exe': {'includes': ['ServiceHandler']}} 

executables = [Executable('Config.py', base='Win32Service', targetName='gsr.exe')] 

setup(name='GSR', 
    version='0.1', 
    description='GSR SERVICE', 
    executables=executables, 
    options=options 
    ) 

和config.py是:

NAME = 'GSR_%s' 
DISPLAY_NAME = 'GSR TEST - %s' 
MODULE_NAME = 'ServiceHandler' 
CLASS_NAME = 'Handler' 
DESCRIPTION = 'Sample service description' 
AUTO_START = True 
SESSION_CHANGES = False 

,但是當我嘗試建立它(蟒蛇setup.py版本)我得到一個錯誤: 「cx_Freeze.freezer.ConfigError:沒有名爲Win32Service基地」

其次,我試圖用一個普通cx_freeze設置,該exe我得到安裝服務不錯,但一旦我嘗試啓動它,我得到一個錯誤或: 「錯誤1053:沒有及時到開始或控制請求服務」

setup.py - 蟒蛇3.3 regualr exe文件,安裝服務,但試圖啓動時,它發送一個錯誤:

from cx_Freeze import setup, Executable 

packages = ['win32serviceutil','win32service','win32event','servicemanager','socket','win32timezone','cx_Logging','ServiceHandler'] 
build_exe_options = {"packages": packages} 
executable = [Executable("ServiceHandler.py")] 


setup( name = "GSR_test", 
     version = "1.0", 
     description = "GSR test service", 
     options = {"build_exe": build_exe_options}, 
     executables = executable) 

最後,我設法得到它在Python 2.7工作中使用py2exe,但py2exe不適用於Python 3.3和我在我的代碼是在3.3

我想這個問題是在配置與cx_freeze一起使用的setup.py。 有什麼想法?

我的ServiceHandler:

import pythoncom 
import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 
from test import test 
import threading 

class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "GSR_test" 
    _svc_display_name_ = "GSR test Service" 

    def __init__(self,args): 
     win32serviceutil.ServiceFramework.__init__(self,args) 
     self.hWaitStop = win32event.CreateEvent(None,0,0,None) 
     socket.setdefaulttimeout(60) 
     self.app = test() 
     self.flag = threading.Event() 

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

    def SvcDoRun(self): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     t = threading.Thread(target=self.app.run) 
     t.start() 
     self.flag.wait() 
     raise SystemExit 

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

Setup.py,蟒蛇2.7使用py2exe的作品:(從here拍攝)

from distutils.core import setup 
import py2exe 

setup( service = ["ServiceHandler"], 
     description = "SERVICE TEST", 
     modules = ["GSR_test"], 
     cmdline_style='pywin32',) 

感謝, 阿米特

+0

什麼不起作用?是否有任何記錄錯誤? – TAS

+0

我更新了問題幷包含更多詳細信息 – AmitE

+2

Win32service base目前僅支持Python 2。它正在等待某人添加Python 3支持。 –

回答

0

看來Win32Service was updated with Python 3.x support內由於this thread的cx_Freeze項目。此用戶最初有與您報告相同的問題,所以我假設這也將解決您的問題。

根據報告的錯誤,是因爲Freezer.py中的_GetBaseFileName()未能找到已編譯的Win32Service.exe。當cx_Freeze得到built/installed時,應該建立這個可執行文件。

如果問題不多,可以搜索已安裝的cx_Freeze安裝目錄中的「Win32Service.exe」並確認它存在。希望這能讓你更近一步。

+0

雖然基礎文件似乎更新,如果我嘗試凍結服務(使用從cx_freeze提供的示例)我仍然收到錯誤 - cx_Freeze.freezer.ConfigError:no基地名爲Win32Service。事實上,如果我去看基本文件夾(與EXE不是C文件),它仍然缺少(沒有win32Service.exe)..也許它只是需要編譯和有人fortgot。使用cx_freeze v4.3.4 – AmitE

+0

僅供參考,cx_Freeze的常規pip安裝將不會在其上面的文件夾中具有cx_Logging文件夾,因此Win32Service基礎將不會被編譯。如果你同時下載源代碼到/tmp/cx_Freeze/和/tmp/cx_Logging,然後在cx_Logging THEN cx_Freeze上運行python setup.py install,你將最終得到Win32Service的基礎。 – ZachM

0

我編輯的Win32Service.ccx_freeze SRC爲python3支持

一些預處理指令來編輯它,因爲python2支持太(用於python2但沒有測試過)的cx_freeze

  1. 的下載源從pypi提取它
  2. 下載cx_logging並將其解壓到cx_freeze-4.3.4目錄
  3. my edited version
  4. 編輯行170 setup.pyif moduleInfo is not None and sys.version_info[:2] < (3, 0):if moduleInfo is not None:
  5. 運行python setup.py buildcx_freeze-4.3.4目錄替換Win32Service.c文件cx_Freeze-4.3.4\source\bases(必須安裝MSC的C源文件編譯)
  6. 副本cx_Freeze-4.3.4\build\lib.win32-3.4\cx_Freeze\bases\Win32Service.exeC:\Python34\Lib\site-packages\cx_Freeze\bases(或者你的python3的安裝路徑)
  7. 現在你可以使用Win32Service base(不再有cx_Freeze.freezer.ConfigError: no base named Win32Service錯誤)創建冷凍exe文件
2

tldr的Python 3.5的Windows服務與pyinstaller建設:gist

這裏一個簡單的Windows服務與蟒蛇:

WindowsService.py

import servicemanager 
import socket 
import sys 
import win32event 
import win32service 
import win32serviceutil 


class TestService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "TestService" 
    _svc_display_name_ = "Test Service" 

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

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

    def SvcDoRun(self): 
     rc = None 
     while rc != win32event.WAIT_OBJECT_0: 
      with open('C:\\TestService.log', 'a') as f: 
       f.write('test service running...\n') 
      rc = win32event.WaitForSingleObject(self.hWaitStop, 5000) 


if __name__ == '__main__': 
    if len(sys.argv) == 1: 
     servicemanager.Initialize() 
     servicemanager.PrepareToHostSingle(TestService) 
     servicemanager.StartServiceCtrlDispatcher() 
    else: 
     win32serviceutil.HandleCommandLine(TestService) 

創建pyinstaller(pip install pyinstaller)和Python一個exe 3.5:

(env)$ python -V 
Python 3.5.2 

(env)$ pip freeze 
PyInstaller==3.2 

(env)$ pyinstaller -F --hidden-import=win32timezone WindowsService.py 

安裝並運行服務

(env) dist\WindowsService.exe install 
Installing service TestService 
Service installed 

(env) dist\WindowsService.exe start 
Starting service TestService 

檢查C:\\TestService.log文件。

停止和清潔

(env) dist\WindowsService.exe stop 
(env) dist\WindowsService.exe remove 
+0

它真的有用!謝謝! (Python 3.6.3,PyInstaller == 3.3) – tulsluper

相關問題