我的問題
Python 用 pyinstaller 打包的 exe 做成服務會有 1053 錯誤,如何解決?我聽說 win32 套件可以解決問題,請提供 install、run、stop、remove 的方法,以及以下是我的程式碼:
print("Hello World!")
ChatGPT 回應
你遇到的 1053 錯誤通常是由於 Windows 服務在預期時間內未能正確啟動而引起的。為了使用 win32 套件將你的 Python 程式打包成服務,你可以按照以下步驟進行:
安裝 win32 套件:
pip install pywin32
修改你的程式碼,以便能夠以服務形式運行。請參考下面的範例:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import win32evtlogutil
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = 'MyService'
_svc_display_name_ = 'My Service'
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
self.is_alive = True
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.is_alive = False
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()
def main(self):
# 主要的程式邏輯在這裡
print("Hello World!")
win32evtlogutil.ReportEvent(self._svc_name_,
servicemanager.PYS_SERVICE_STARTED,
0, servicemanager.EVENTLOG_INFORMATION_TYPE,
(self._svc_name_, ''))
# 在這裡添加你的主要程式邏輯,確保能夠適應以服務形式運行
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
# 如果是運行而非安裝服務,可以使用以下程式碼
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(MyService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(MyService)
安裝服務:
在命令提示字元中以管理員身分執行以下命令:
python your_script.py install
運行服務:
python your_script.py start
停止服務:
python your_script.py stop
移除服務:
python your_script.py remove
請確保替換 your_script.py
為你的實際程式檔案名稱。希望這能夠幫助你解決問題。