302

データベースに格納された相互に関連するさまざまなオブジェクトを共有する一連のプログラムのアーキテクチャをスケッチしています。プログラムの 1 つを、これらのオブジェクトに対する操作のためのより高いレベルのインターフェイスを提供するサービスとして機能させ、他のプログラムがそのサービスを介してオブジェクトにアクセスするようにしたいと考えています。

そのサービスを実装する技術として、現在PythonとDjangoフレームワークを目指しています。Linux で Python プログラムをデーモン化する方法を理解していると確信しています。ただし、システムが Windows をサポートする必要があるのは、オプションの仕様項目です。Windows プログラミングの経験はほとんどなく、Windows サービスの経験もまったくありません。

Python プログラムを Windows サービスとして実行する (つまり、ユーザー ログインなしで自動的に実行する) ことはできますか? 必ずしもこの部分を実装する必要はありませんが、これらの線に沿って設計するかどうかを決定するために、どのように実行するかの大まかなアイデアが必要です.

編集:これまでのすべての回答に感謝します。それらは非常に包括的です。もう 1 つ知りたいことがあります。Windows はどのように私のサービスを認識していますか? ネイティブの Windows ユーティリティで管理できますか? /etc/init.d に起動/停止スクリプトを配置するのと同じことは何ですか?

4

13 に答える 13

276

はい、できます。ActivePythonに含まれている、またはpywin32(Python for Windows拡張機能)とともにインストールできるpythoncomライブラリを使用して実行します。

これは、単純なサービスの基本的なスケルトンです。

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (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):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        pass

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

コードはメソッドに入ります。通常、メソッドmain()で設定したフラグをチェックすることで中断される可能性のある、ある種の無限ループがあります。SvcStop

于 2008-08-28T14:39:04.763 に答える
52

数週間前に選択した回答に賛成票を投じましたが、その間、私はこのトピックでさらに苦労しました. 特別な Python をインストールし、特別なモジュールを使用してスクリプトをサービスとして実行するのは、単に間違った方法のように感じます。携帯性などはどうですか?

私は素晴らしいNon-sucking Service Managerに出くわしました。これにより、Windows サービスの処理が非常に簡単になり、正気になりました。インストール済みのサービスにオプションを渡すことができるので、Python 実行可能ファイルを選択してスクリプトをオプションとして渡すこともできると考えました。

私はまだこの解決策を試していませんが、今すぐ試して、プロセスに沿ってこの投稿を更新します. Windows で virtualenvs を使用することにも興味があるので、遅かれ早かれチュートリアルを作成して、ここにリンクするかもしれません。

于 2014-07-28T13:41:31.923 に答える
23

事実上すべてのWindows実行可能ファイルをサービスとしてインストールするためのいくつかの選択肢があります。

方法1:rktools.exeのinstsrvとsrvanyを使用する

WindowsHomeServerまたはWindowsServer2003 (WinXPでも動作します)の場合、Windows Server 2003リソースキットツールには、 instsrv.exeおよびsrvany.exeと呼ばれるこれと連携して使用できるユーティリティが付属しています。これらのユーティリティの使用方法の詳細については、このMicrosoftKBの記事KB137890を参照してください。

Windows Home Serverの場合、適切に「AnyServiceInstaller」という名前のこれらのユーティリティ用の優れたユーザーフレンドリーなラッパーがあります

方法2:WindowsNT用のServiceInstallerを使用する

ServiceInstaller for Windows NTここからダウンロード可能)を使用する別の方法があり、 Pythonの説明が利用可能です。名前とは逆に、Windows2000とWindowsXPの両方で動作します。Pythonスクリプトをサービスとしてインストールする方法の説明を次に示します。

Pythonスクリプトのインストール

ServiceInstallerを実行して、新しいサービスを作成します。(この例では、Pythonがc:\ python25にインストールされていることを前提としています)

Service Name  : PythonTest
Display Name : PythonTest 
Startup : Manual (or whatever you like)
Dependencies : (Leave blank or fill to fit your needs)
Executable : c:\python25\python.exe
Arguments : c:\path_to_your_python_script\test.py
Working Directory : c:\path_to_your_python_script

インストール後、コントロールパネルのサービスアプレットを開き、PythonTestサービスを選択して開始します。

最初の回答の後、SOにすでに密接に関連するQ&Aが投稿されていることに気づきました。参照:

Pythonスクリプトをサービスとして実行できますか(Windowsの場合)?どのように?

Pythonで作成したサービスをWindowsに認識させるにはどうすればよいですか?

于 2009-02-28T08:30:54.350 に答える
4

pywin32でサービスとしてホスティングを開始しました。

すべて順調でしたが、システムの起動時にサービスが 30 秒 (Windows のデフォルトのタイムアウト) 以内に開始できないという問題に遭遇しました。1 台の物理マシンでホストされている複数の仮想マシンで Windows の起動が同時に行われ、IO 負荷が非常に大きかったため、これは私にとって非常に重要でした。エラー メッセージは次のとおりです。

Error 1053: The service did not respond to the start or control request in a timely fashion.

Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.

私は pywin と多くの戦いをしましたが、この回答で提案されているように NSSM を使用することになりました。それに移行するのは非常に簡単でした。

于 2018-10-12T13:07:47.503 に答える