我的目標是創建一個可用於安裝Windows系統服務的單一(或多個).exe。目前這只是一個概念證明,所以我所有的服務都是寫入一個文件來確認它的存在。涉及py2exe&python服務的問題
當我從.py文件調用服務時,它會安裝並正常運行。當我使用py2exe製作一個.exe文件時,它運行良好,但是我在Windows事件日誌(應用程序)中收到了一些消息,指出找不到某些庫。有時候Windows會在啓動後停止服務,有時Windows會忽略「找不到模塊」的錯誤。所有這些都在XP SP3機器上進行。
當我將相同的.exe編譯爲w/py2exe到Win 7 SP1機器時,win7會告訴我,沒有python27.dll就無法運行.exe。所以我在.exe的cwd中移動python27.dll,然後Win 7告訴我它沒有加載.dll文件。當我嘗試在XP SP2機器上運行.exe時,XP告訴我該文件無法加載。
這裏是對應的代碼:
PySvc.py(這是實際的服務,PySvc.py安裝用於從提示安裝它的字符串:
import win32service
import win32serviceutil
import win32event
import servicemanager
class PySvc(win32serviceutil.ServiceFramework):
_svc_name_ = "PySvc"
_svc_display_name_ = "Python Test"
_svc_description_ = "Service Test"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# Meat and potatos. This is the actual code that's run. Currently testing
# to see behavior inside and outside of loop.
def SvcDoRun(self):
f = open('test.dat', 'w+')
rc = None
f.write('OUTSIDE L00P\n')
# continue iteration if stop event not recieved
while rc != win32event.WAIT_OBJECT_0:
f.write('BEAUTIFUL TEST DATA NEW INSIDE L00P\n')
f.flush()
# block for 5 seconds and listen for a stop event
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
f.write('SHUTTING DOWN\n')
f.close()
# called on shut down
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(PySvc)
以下是對於「setup.py」的代碼。setup.py py2exe是用於創建.exe文件的字符串。
from distutils.core import setup
import py2exe
setup(
name = 'PySvc',
description = 'Service Test',
version = '1.00.00',
service = ['PySvc'],
console = ['PySvc.py'],
zipfile=None,
options = {
"py2exe":{
"includes":"win32service,win32serviceutil,win32event,servicemanager",
},
},
)
由於本地機器,但失敗的.exe文件的明顯的成功在其他幾家機器(沒有安裝python),我目前傾向於認爲這是導入問題或進口編譯方式。我會永遠感激,如果任何人都可以提供一些見解,爲什麼這個.exe不想要像它應該的行爲。感謝您的時間。