私の目標は、Windows システム サービスのインストールに使用できる単一 (または複数) の .exe を作成することです。現在、これは単なる概念実証であるため、私のサービスはファイルに書き込み、その存在を確認するだけです。
.py ファイルからサービスを呼び出すと、インストールされて正常に実行されます。py2exe を使用して .exe を作成すると正常に動作しますが、特定のライブラリが見つからないというメッセージが Windows イベント ログ (アプリケーション) に表示されます。起動後に Windows がサービスを停止することもあれば、Windows が「モジュールが見つかりません」というエラーを無視することもあります。これはすべて XP SP3 マシンで行われます。
py2exe でコンパイルされた同じ .exe を Win 7 SP1 マシンに移動すると、win7 から、python27.dll なしでは .exe を実行できないことが通知されます。そのため、.exe の cwd で python27.dll を移動すると、Win 7 から .dll のロードに失敗したことが通知されます。XP SP2 マシンで .exe を実行しようとすると、XP からファイルを読み込めないと表示されます。
対応するコードは次のとおりです。
PySvc.py (これは実際のサービスです。PySvc.py install は、プロンプトからインストールするために使用される文字列です。
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 が本来の動作を望まない理由について、誰かが何らかの洞察を提供できれば、私は永遠に感謝します。お時間をいただきありがとうございます。