用python实现windows服务-在服务中新建进程

本文介绍如何使用Python和pywin32库在Windows环境下创建并管理一个后台服务程序。该服务程序能够启动并监控一个外部Python应用程序,通过配置文件读取应用路径等信息。

需要安装的软件:python和pywin32,我这里装的分别是python-2.6.amd64、pywin32-217.win-amd64-py2.6

文件名:dma_ws.py

#!python
 
import win32serviceutil 
import win32service 
import win32event
import os 
from subprocess import Popen, PIPE
import json
import signal
run_proc = None
 
class DMA_WS(win32serviceutil.ServiceFramework): 
    _svc_name_ = "DMA_WS"
    _svc_display_name_ = "DMA_WS"
    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):
        f = file('C:/DXMonitorSystem/dma.conf')
        host = json.load(f)
        f.close()
        dxsrv = os.path.join(host['app_path'], 'DXHttpServer.py')
        run_proc = Popen([host['ironpython'], dxsrv],
                        stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False,
                        cwd=host['app_path']) #这里新建进程,注意cwd参数必不可少且要是绝对路径
        #res, err = run_proc.communicate()
        #这个函数内的上面部分都是逻辑处理的部分,可以根据自己的需求订制,但下面这行代码任何服务都需要
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
        run_proc.kill() # 用于关闭服务所创建的子进程
        #os.kill(run_proc.pid, signal.SIGTERM)
 
if __name__=='__main__':
    win32serviceutil.HandleCommandLine(DMA_WS)

使用方法

创建服务:Python dma_ws.py install

开始服务:python dma_ws.py start

停止服务:python dma_ws.py stop


转载请注明出处:http://blog.youkuaiyun.com/liujian0616/article/details/7950758

<think>好的,我现在需要帮用户解决在Windows系统中以后台方式启动Python服务的问题。用户想要知道具体的方法或教程,包括启动方式和服务实现。让我先回忆一下之前提供的引用内容,看看有哪些方法可以推荐。 首先,用户提到的引用中有几种不同的方法。比如引用[1]提到使用批处理脚本结合mshta和vbscript来隐藏窗口。具体来说,批处理文件中通过判断参数来启动隐藏的进程,然后执行Python脚本。这种方法看起来可行,用户可能需要详细的步骤说明。 然后引用[2]提到了使用pythonw命令,这个命令应该是不显示控制台窗口的。但用户可能不清楚pythonw和python的区别,以及如何正确使用它。需要解释一下两者的不同,给出示例。 引用[3]和[4]提到了taskkill命令来结束进程,但用户的问题是关于启动而不是结束。不过引用[4]中的批处理脚本可能有帮助,里面使用了start /b命令来后台运行,同时结合其他命令来设置路径和执行Python脚本。这可能是一种方法,但需要确认start /b是否真的能在后台运行而不显示窗口。 引用[5]提到了使用PowerShell的Start-Process命令,指定-WindowStyle hidden来隐藏窗口。这个方法可能更简单,直接通过PowerShell脚本来启动隐藏的进程,可能比批处理更可靠。 接下来,我需要整理这些方法,按照用户的需求进行分类。用户需要的是启动方式和服务实现。启动方式可能包括命令行工具、批处理脚本、Python模块等。服务实现可能需要将脚本注册为系统服务,这样可以在后台持续运行,且可以随系统启动。 首先,方法一:使用pythonw命令。这是最直接的方式,只需将python替换为pythonw,这样就不会弹出控制台窗口。但需要注意的是,pythonw通常用于GUI应用程序,但也可以用于无窗口的后台脚本。需要提醒用户如果脚本有输出,可能需要重定向到文件,否则输出会丢失。 方法二:批处理脚本结合VBScript。如引用[1]和[4]中的方法,通过批处理文件调用mshta和vbscript来隐藏窗口。这需要编写一个批处理文件,其中包含条件判断,当参数为show时执行Python脚本,否则以隐藏方式启动自身。这种方法有效,但步骤稍多,需要用户正确编写批处理文件。 方法三:PowerShell启动。如引用[5]提到的,使用PowerShell的Start-Process命令,设置-WindowStyle hidden。用户可以编写一个PowerShell脚本或者直接在批处理中调用PowerShell命令来启动隐藏的Python进程。这可能更现代且可靠,因为PowerShell功能更强大。 方法四:使用第三方工具如NSSM。用户可能不想依赖第三方工具,但NSSM是一个常用的将可执行文件注册为Windows服务的工具。这对于需要作为服务长期运行的情况非常有用,比如机自启动、服务管理界面管理等。需要指导用户下载NSSM,创建服务配置启动参数。 另外,引用[3]提到了taskkill来杀死进程,但用户的问题是关于启动的,这部分可能不需要,除非用户需要停止服务的方法。但可能需要在服务实现部分提到如何停止服务,比如使用sc stop或者通过NSSM管理。 还需要考虑不同方法的优缺点。例如,pythonw简单但可能不适合需要服务管理的场景;批处理和PowerShell方法需要编写脚本,但灵活;NSSM适合作为服务长期运行,但需要安装第三方工具。 用户可能希望有多种方法可选,因此需要分点列出,详细说明每个步骤。同时,需要确保所有命令和脚本的正确性,比如在批处理文件中路径是否正确,是否需要管理员权限等。 另外,需要注意潜在的问题,比如使用pythonw时,如果脚本有标准输出或错误,这些信息不会显示,可能导致调试困难,建议用户将输出重定向到日志文件。例如:pythonw main.py > output.log 2>&1。 在服务实现部分,除了NSSM,可能还有其他方式,比如使用pywin32库中的ServiceFramework,但这对用户来说可能比较复杂,特别是如果他们没有Python发经验的话。所以可能推荐NSSM作为更简单的方法。 最后,要确保回答结构清晰,分点列出不同的方法,每个方法都有步骤说明和示例代码或命令。同时,在相关问题部分,可以提出如何管理后台进程、如何记录日志、如何设置机启动等,帮助用户进一步解决问题。</think>### 分步解答:Windows后台运行Python服务的5种方法 #### 方法一:使用pythonw命令(基础版) **原理**:Windows系统提供的`pythonw.exe`解释器会直接隐藏控制台窗口。 ```bash # 直接执行(无窗口) pythonw your_script.py # 带日志记录(推荐) pythonw your_script.py > service.log 2>&1 ``` **注意**:`>`符号将标准输出重定向到日志文件,`2>&1`将错误输出合到标准输出[^2]。 #### 方法二:VBScript启动(稳定版) 1. 新建`start.vbs`文件 ```vbscript Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c python your_script.py", 0 ``` 2. 双击运行脚本,任务管理器可见`python.exe`后台进程[^1] #### 方法三:PowerShell隐藏窗口(推荐) ```powershell Start-Process -WindowStyle Hidden -FilePath "python" -ArgumentList "your_script.py" ``` 或保存为`start.ps1`脚本,右键选择"使用PowerShell运行"[^5] #### 方法四:注册为系统服务(专业版) 使用**NSSM工具**(非微软官方但广泛使用): 1. 下载[nssm.exe](https://nssm.cc/download) 2. 以管理员身份执行: ```cmd nssm install MyPythonService ``` 3. 配置对话框设置: ``` Path: C:\Python39\python.exe Startup directory: D:\your_project Arguments: your_script.py ``` 4. 服务管理命令: ```cmd net start MyPythonService # 启动 sc queryex MyPythonService # 查看PID ``` #### 方法五:批处理终极方案 新建`start.bat`: ```batch @echo off %1 start "" mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""python your_script.py"", 0:close") ``` 该方案通过`mshta`调用VBScript实现零窗口启动,支持机自启动[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值