是否可以不用编译就用python(标准python.org python)编写windows(10)服务

是否可以不用编译就用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模块可用于此目的,并且可以这样编写:您可以运行脚本来安装/启用/禁用/启动/停止

是否可以在不涉及第三方软件(如nssm或ActiveState python)的情况下,将windows 10服务编写为python脚本,而不说这两种解决方案都不好

仅:

剧本 Python pip安装包 从命令行安装 可能吗?

因此,我找到了一种最简单的方法来实现一个自给自足的python脚本,而不需要任何第三方编译器/服务:

安装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)