1

私の目標は、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 が本来の動作を望まない理由について、誰かが何らかの洞察を提供できれば、私は永遠に感謝します。お時間をいただきありがとうございます。

4

1 に答える 1

1

もう少し情報がないと 100% 確信できませんが、同様の問題に遭遇しました。Python 2.6、2.7、3.0、3.1 では、c ランタイム dll を自分でパッケージにバンドルする必要があることが判明しました。

python は既にインストールされているため、インストールされている可能性があります。あなたのエンドユーザーはそうではないでしょう。この問題の詳細については、py2exe の Web サイトを参照してください。

于 2012-08-15T19:07:35.880 に答える