【问题标题】:Can't start Windows service written in Python (win32serviceutil)无法启动用 Python 编写的 Windows 服务(win32serviceutil)
【发布时间】:2012-01-20 15:00:41
【问题描述】:

我正在尝试启动一个简单的服务示例:

someservice.py:

import win32serviceutil 
import win32service 
import win32event

class SmallestPythonService(win32serviceutil.ServiceFramework):
    _svc_name_ = "SmallestPythonService"
    _svc_display_name_ = "display service"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

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

当我跑步时

python someservice.py install

一切正常,服务出现在 Windows 服务列表中,但是

python someservice.py start

失败并显示“错误 1053:服务未及时响应启动或控制请求”,但没有任何延迟。

我搜索了一个解决方案,它说当pythonservice.exe 找不到python27.dll 时会发生这种情况。实际上不能,所以我将C:\Python27 添加到PATH。现在pythonservice.exe 运行良好,但错误 1053 仍然存在。

我在具有管理员权限的 Windows 7 Ultimate 上运行带有 pywin32 216 的 Python 2.7.2。

【问题讨论】:

  • 这对我有用,运行 Python 2.6.6(64 位)和 pywin32 216 amd64-py26。我意识到这不是很有帮助。在 Windows 7 专业版上。
  • +1 表示如果pythonservice.exe 找不到python27.dll 会发生错误1053。我花了很长时间才弄清楚这一点!谢谢:)

标签: python windows windows-services pywin32


【解决方案1】:

另外,感谢您指出这可能是一个 DLL 问题,这使我找到了正确的解决方案。

您需要做的是将 Python27 添加到 SYSTEM PATH,而不是 USER PATH,因为默认情况下,python 服务将作为“LocalSystem”安装,因此当它尝试启动时,它会使用 SYSTEM PATH变量 - 这就是您可以从命令提示符运行它的原因,您的 USER PATH 是正确的。

希望对你有帮助!

【讨论】:

  • 在这种情况下,将这些目录也添加到您的系统路径中可能会很有用:C:\Python27\Lib\site-packages\win32C:\Python27\Lib\site-packages\pywin32_system32。这将使您更轻松地使用pythonservice。
  • @BuvinJ 这修复了我在使用 PythonService.exe 时出现的错误 1053。谢谢!
  • @mpaf 你能帮忙描述一下如何向系统路径添加东西吗?啊,我明白了,您只需将其添加到“系统控制面板”中的整个计算机系统路径即可。就我个人而言,我不得不添加 anaconda,如 snip2code.com/Snippet/770602/…
【解决方案2】:

我也遇到了这个问题,并且能够通过将以下内容添加到我的 "__main__" 执行块来解决它:

if len(sys.argv) == 1:
    servicemanager.Initialize()
    servicemanager.PrepareToHostSingle(RouterService)
    servicemanager.StartServiceCtrlDispatcher()
else:
    win32serviceutil.HandleCommandLine(RouterService)

(不要忘记在文件顶部导入 servicemanager)。

我认为问题在于 Windows 服务管理器运行不带参数的可执行文件(默认情况下),在这种情况下,需要正确告知应用程序启动服务,SvcDoRun 不会自动调用它好像。

正如其他人提到的,如果从命令行运行它,则确实需要路径映射。在我的应用程序中,我使用cx_freeze 冻结了服务,并使用可执行文件来安装服务,因此包含了所有依赖项。

【讨论】:

    【解决方案3】:

    我相信你的问题会通过改变方法来解决SvcDoRun

    来自

       def  SvcDoRun(self):
            win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
    

       def  SvcDoRun(self):
            self.ReportServiceStatus(win32service.SERVICE_RUNNING)
            win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
    

    【讨论】:

      【解决方案4】:

      确保使用与默认本地系统用户不同的用户运行应用程序。将其替换为您能够成功运行调试命令的用户。

      要替换用户转到 Windows 服务(开始 > services.msc) 右键单击您创建的服务 > 属性 > 登录 取消选中本地系统帐户并输入您自己的。 来自all python windows service can not start{error 1053} 为我工作。

      因为我只是为用户设置了路径,所以在本地系统帐户下运行时它缺少环境。

      【讨论】:

      • 这个解决方案在 python 3.8 上对我有效,我尝试了其他解决方案,例如将 win32 添加到系统 PATH,也将 pywintypes38.dll 添加到 win32,但这些都不起作用。
      【解决方案5】:

      另一个有用的提示是添加以下行

      sys.frozen = 'windows_exe' # Fake py2exe so we can debug

      打电话之前

      win32serviceutil.HandleCommandLine(...)

      这样,您就可以从服务中获得更多有用的信息,以找出问题所在。

      【讨论】:

        【解决方案6】:

        我也无法启动python服务,我安装了python39。

        我的问题是缺少pywintypes39.dll 这导致错误 1053 无法启动服务

        windows中负责启动python服务的模块在路径上找到 C:\Users\.....\AppData\Local\Programs\Python\Python39\Lib\site-packages\win32 pythonservice.exe

        但缺少的 .dll 安装在名为 lib 的子文件夹中 \AppData\Local\Programs\Python\Python39\Lib\site-packages\win32\lib

        将缺少的 .dll 从 \Lib 文件夹传输到根文件夹 \win32,其中 pythonservice.exe 将使服务程序可以访问。

        这对我有用。

        【讨论】:

          【解决方案7】:

          我可以按照这些procedure 使用 Python 3.5 和 PyInstaller 来运行该服务

          【讨论】:

            【解决方案8】:

            错误的原因可能来自不同的原因。除了使用日志流,我强烈建议考虑nssmhttp://nssm.cc/download

            根据我的经验;为了从 python 文件、批处理文件 (.bat) 和可执行文件创建 Windows 服务,我付出了很多努力。与sc 或使用 win32serviceutil 的原始 python 代码不同,Nssm 是安装服务的绝佳工具。

            有一个调用主函数的模块并在批处理文件中运行该模块。然后批处理文件就可以用于windows服务了。

            在python模块中:

            """ 
            main.py 
            """ 
            from myCode import run.py
            
            run()
            

            在service.bat中:

            python main.py
            

            然后使用 nssm 可以轻松安装指向文件 service.bat 的 windows 服务

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多