将CherryPy服务器脚本作为Windows服务安装和启动(使用sc.exe)

0 投票
3 回答
4320 浏览
提问于 2025-04-16 17:58

我正在尝试将一个简单的 CherryPy 服务器安装并作为 Windows 服务启动。

这里是我的脚本:(为了简洁,删掉了一些行。手动在命令行执行时一切正常)

app = AdminMediaHandler(django.core.handlers.wsgi.WSGIHandler())
logged_app = TransLogger(app)
server = wsgiserver.CherryPyWSGIServer( ('127.0.0.1', 8632), logged_app, server_name='localhost', numthreads=20 )

try:
    server.start()
except KeyboardInterrupt:
    server.stop()

我使用 sc.exe 来安装和启动这个服务。安装过程没问题,但我似乎无法启动这个服务。

我使用的命令是:(注意路径中有空格,不过我用双引号处理了这个问题,而且 binPath 在命令行手动执行时可以正常工作)

> sc.exe create "ServiceName" binPath= "\"C:\Path to Python\python.exe\" \"C:\Path to CherryPy Script\cherryserver.py\""

> sc.exe start "ServiceName"

无论是通过 sc.exe 还是通过 services.msc 的图形界面来启动服务,我总是收到这个错误:

[SC] StartService FAILED 1053:

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

根据我的理解,这个问题是因为 python.exe 没有实现 Windows 服务 API。

我不想使用 py2exe 将脚本转换成 .exe 文件。

我找到了一些建议,提到可以使用不同的工具来安装服务,而不是 sc.exe,这些工具叫做 srvany.exeinstsrv.exe。不过,我在 Win2K Resource Kit 网站 上找不到它们。

有没有人知道怎么成功地将这个 .py 文件安装并启动为 Windows 服务?

有没有人知道

3 个回答

1

我更喜欢用 nssm 来把普通脚本安装成服务。你可以把 nssm.exe 复制到 C:\Windows\system32 或者 C:\Windows\SysWOW64 这个文件夹,具体看你的系统是什么。这样一来,你就可以按照下面的方式来安装一个服务:

nssm install yourservicename

如果是一个 Python 脚本,你需要把应用程序的路径设置为你的 python.exe,而参数就是你的脚本本身。

nssm的基本配置

还有一些常用的命令可以用来启动、停止或编辑你的服务:

nssm start yourservicename
nssm stop yourservicename
nssm edit yourservicename
5

CherryPy自带了一个可以作为Windows服务启动的模块。想知道怎么安装和运行,可以参考这个StackOverflow上的问题。你可能需要改变一下现在的做法(也就是直接把Django应用传给WSGIServer),改用cherrypy.tree.graft来处理。

0

最后我使用了 ServiceInstaller,也叫 SMaster,就像这个回答里说的那样。不过,那个回答里提供的链接坏掉了,我找不到能用的链接。我之前本地就有 srunner.exe

不过,还有一个问题需要解决,那就是 ServiceInstaller 不能处理路径中带有 空格 的文件

所以,我用了老式的DOS路径格式来注册服务。

我没有注册 C:\Program Files\MyApp\python.exe,而是注册了 C:\PROGRA~1\MyApp\python.exe

撰写回答