是否可以不用编译就用python(标准python.org python)编写windows(10)服务
是否可以在不涉及第三方软件(如nssm或ActiveState python)的情况下,将windows 10服务编写为python脚本,而不说这两种解决方案都不好 仅: 剧本 Python pip安装包 从命令行安装 可能吗?因此,我找到了一种最简单的方法来实现一个自给自足的python脚本,而不需要任何第三方编译器/服务: 安装win32模块包:是否可以不用编译就用python(标准python.org python)编写windows(10)服务,python,windows-services,Python,Windows Services,是否可以在不涉及第三方软件(如nssm或ActiveState python)的情况下,将windows 10服务编写为python脚本,而不说这两种解决方案都不好 仅: 剧本 Python pip安装包 从命令行安装 可能吗?因此,我找到了一种最简单的方法来实现一个自给自足的python脚本,而不需要任何第三方编译器/服务: 安装win32模块包: pip3 install pypiwin32 代码: win32模块可用于此目的,并且可以这样编写:您可以运行脚本来安装/启用/禁用/启动/停止
pip3 install pypiwin32
代码:
win32模块可用于此目的,并且可以这样编写:您可以运行脚本来安装/启用/禁用/启动/停止服务,但是请注意,如果脚本中有任何代码试图写入控制台,则脚本将通过回溯停止。另外,可以从microsoft下载的文件srvany.exe可以用来运行任何可执行文件,作为带有参数的服务,但是它不能很好地处理我记忆中的开始/停止消息。我没有找到如何pip安装win32模块。它似乎与ActiveState python一起提供。。它是否可用于python.org python?确定使用pip3安装pypiwin32找到并安装它,绕过与我的双python2/3安装相关的问题。是否有指向使用win32模块的windows服务代码的链接?有几个链接:作为附加功能,您可以导入sys并覆盖sys.stderr和sys.stdout,以指向servicemanager.LogMsg函数或包装器,以便将任何输出记录到windows事件日志中,请注意,替换内容需要是类似文件的对象
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import sys
class TestService(win32serviceutil.ServiceFramework):
_svc_name_ = 'TestService'
_svc_display_name_ = 'TestService'
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):
f = open('D:\\test.txt', 'a')
rc = None
while rc != win32event.WAIT_OBJECT_0:
f.write('Test Service \n')
f.flush()
# block for 24*60*60 seconds and wait for a stop event
# it is used for a one-day loop
rc = win32event.WaitForSingleObject(self.hWaitStop, 24 * 60 * 60 * 1000)
f.write('shut down \n')
f.close()
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(TestService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(TestService)