以下のコードを、通常のコマンドプロンプトからpython win_service.py installで実行しています。アクセス拒否エラーが表示されます。
サービスTestServiceのインストール
サービスのインストールエラー:アクセスが拒否されました。(5)
管理者として起動してコマンドプロンプトを起動したときに解決できました。
サービスをインストールできましたが、サービスを開始できませんでした。
インストールされているサービス
開始サービスTestService
サービスの開始エラー:サービスは開始または制御要求にタイムリーに応答しませんでした。
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):
print "running"
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
問題は何ですか?問題を解決するサービスをインストールする他の方法と、管理者として動的に実行する方法はありますか?.
私はこれが古いことを知っていますが、私はこれに永遠に行き詰まりました。私にとって、この特定の問題はこのファイルをコピーすることで解決されました-pywintypes36.dll
から-> Python36\Lib\site-packages\pywin32_system32
宛先-> Python36\Lib\site-packages\win32
これに関する素晴らしい記事があります-> https://www.thepythoncorner.com/2018/08/how-to-create-a-windows-service-in-python
実行可能ファイルが見つからないため、サービスが開始されていない可能性があります。私のシステムパスにいくつかのpywin32関連ディレクトリを追加することで解決した同様の問題がありました。これは、setx
を使用して行うことができます。
setx /M PATH "%PATH%;C:\Python27;C:\Python27\Scripts;C:\Python27\Lib\site-packages\pywin32_system32;C:\Python27\Lib\site-packages\win32"
これを管理者権限でcmdウィンドウで実行してみて、自分のpythonインストールに一致するようにパスを調整してください。
チップ(およびこれを理解しようとしたときに見逃していた)が指摘しているように、pythonservice.exeはsystemサービスとして実行されるため、ユーザーとして実行する場合とは異なる環境になります。 python service.py debug
の実行は、ユーザー環境で実行されているため問題なく実行されますが、python service.py start
を実行すると、環境変数の違いにより、代わりに失敗する可能性があります。インスタントタイムアウトの原因として最も可能性が高いのは、pythonservice.exeの実行の失敗であり、それはwillの実行に失敗し、PythonXX.dll
またはpywintypesXX.dll
のいずれかが欠落しています。
PythonXX.dll
はすでにシステムパスにある可能性があります(Pythonのインストール方法によって異なります)。ただし、私のようで、環境を変更しないように細心の注意を払っている場合は、私は.\.pyenv37\Scripts\python.exe service.py start
のようなものを実行していて、想定したvenvではなくPATHからPython37.dllを取得するため、pythonservice.exeが別のPATHを使用して実行を開始すると、Windowsレポートにすぐに失敗します。インスタントタイムアウトとして。
同じことがpywintypesXX.dll
にも当てはまりますが、検索パスのどこかにインストールする代わりに、よりポータブルな解決策は、それをpythonservice.exe
と同じディレクトリにドロップすることです デフォルトDLL検索パスを含む 。また、pythonservice.exeが見つからない場合、サービスはすぐにタイムアウトします。
ログを一切使わずにこれを把握することは、絶対的な悪夢です。
編集:これは私がスクリプトのインストール/更新でそれをすべて確認するために使用しているものです:
# customOptionHandler will only run after service install/update
if __name__=='__main__':
win32serviceutil.HandleCommandLine(AppServerSvc, customOptionHandler=post_service_update)
。
def post_service_update(*args):
import win32api, win32con, win32profile, pywintypes
from contextlib import closing
env_reg_key = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
hkey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, env_reg_key, 0, win32con.KEY_ALL_ACCESS)
with closing(hkey):
system_path = win32api.RegQueryValueEx(hkey, 'PATH')[0]
# PATH may contain %SYSTEM_ROOT% or other env variables that must be expanded
# ExpandEnvironmentStringsForUser(None) only expands System variables
system_path = win32profile.ExpandEnvironmentStringsForUser(None, system_path)
system_path_list = system_path.split(os.pathsep)
core_dll_file = win32api.GetModuleFileName(sys.dllhandle)
core_dll_name = os.path.basename(core_dll_file)
for search_path_dir in system_path_list:
try:
dll_path = win32api.SearchPath(search_path_dir, core_dll_name)[0]
print(f"System python DLL: {dll_path}")
break
except pywintypes.error as ex:
if ex.args[1] != 'SearchPath': raise
continue
else:
print("*** WARNING ***")
print(f"Your current Python DLL ({core_dll_name}) is not in your SYSTEM PATH")
print("The service is likely to not launch correctly.")
from win32serviceutil import LocatePythonServiceExe
pythonservice_exe = LocatePythonServiceExe()
pywintypes_dll_file = pywintypes.__spec__.Origin
pythonservice_path = os.path.dirname(pythonservice_exe)
pywintypes_dll_name = os.path.basename(pywintypes_dll_file)
try:
return win32api.SearchPath(pythonservice_path, pywintypes_dll_name)[0]
except pywintypes.error as ex:
if ex.args[1] != 'SearchPath': raise
print("*** WARNING ***")
print(f"{pywintypes_dll_name} is not is the same directory as pythonservice.exe")
print(f'Copy "{pywintypes_dll_file}" to "{pythonservice_path}"')
print("The service is likely to not launch correctly.")
多くのように思えるかもしれませんが、新しいマシン/仮想環境にサービスをデプロイするとき、またはpythonを更新するときに、少なくともこれらの手順を忘れないようにします。
anaconda pythonを使用している場合は、python36.dllがシステムパスにあることを確認してください。これを見つけるのに長い時間がかかりました。
デバッグを開始する前に、 https://github.com/mhammond/pywin32 で説明されている2つのステップを確認することをお勧めします。
pip install pywin32
そして
python Scripts/pywin32_postinstall.py -install
完成しました。
以下のパスがシステム変数パスに追加されていることを確認してください。以下のパスがPython 3.7に追加されています。インストールされているバージョンpythonに従ってパスを追加してください。
C:\ Users\1022226\AppData\Local\Programs\Python\Python37\Scripts C:\ Users\1022226\AppData\Local\Programs\Python\Python37
デフォルトのローカルシステムユーザーとは異なるユーザーでアプリケーションを実行していることを確認してください。デバッグコマンドを正常に実行できるユーザーに置き換えます。
from all python windows service can not start {error 1053} 私のために働きました。
システムではなく、ユーザーのログイン用にPATHを設定するだけだからです。システム変数のPATHを再確認できます。