Python写windows service及exe的安装程序

本文详细介绍如何使用Python创建Windows服务,并通过py2exe进行打包部署。内容涵盖服务脚本编写、服务安装与控制命令、以及如何利用py2exe生成安装文件。

一、 在使用python来创建windows服务, 需要使用pywin32类库, 下载地址:http://sourceforge.net/projects/pywin32/

下面我们创建一个什么也不做的服务,代码如下:
win32test.py

import win32serviceutil
import win32service
import win32event

class win32test(win32serviceutil.ServiceFramework):
    _svc_name_ = "Python Win32 Service"
    _svc_display_name_ = "Python Win32 Service"
    _svc_description_ = "Just for a demo, do nothing."
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
       
    def SvcDoRun(self):

    # 把你的程序代码放到这里就OK了  

    # your code here

    # 以下斜体字体表示的方法未验证过       

    command="python test.py"   
        try:  
            Proc=Popen(command,shell=True,stdout=PIPE,stderr=STDOUT)  
            Str=RRDDataProc.stdout.readline()  
        except:  
            Str="error happend"


        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
       
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
   
if __name__=='__main__':
    win32serviceutil.HandleCommandLine(win32test)

如果你想使用这个服务在启动或者停用时候做点事, 那么就把你要实现的业务写给对应的方法里SvcDoRun和SvcStop.
其他方法大同小异,比如这里

-----------------------------------------------------------------------------------

如果不需要制作安装包,可以

安装服务    python PythonService.py install

自动启动    python PythonService.py --startup auto install

启动服务    python PythonService.py start 

重启服务    python PythonService.py restart

停止服务    python PythonService.py stop

删除/卸载服务  python PythonService.py remove

--------------------------------------------------------------------------------------
二、使用py2exe来把我们上面的service创建成安装文件, py2exe下载地址:http://sourceforge.net/projects/py2exe/
setup.py

from distutils.core import setup
import py2exe

class Target:
    def __init__(self, **kw):
        self.__dict__.update(kw)
        # for the versioninfo resources
        self.version = "1.0.0"
        self.company_name = "Founder Software Suzhou Co. Ltd."
        self.copyright = "Copyright © 2009 Founder Software (Suzhou) Co., Ltd. "
        self.name = "Jchem cartridge windows service"


myservice = Target(
    description = 'foo',
    modules = ['win32test'],
    cmdline_style='pywin32',
    icon_resources=[(1, "cartrigde.ico")]
)

options = {"py2exe":  
            {   "compressed": 1,  
                "bundle_files": 1
            }  
          } 
         
setup(
    service=[myservice],
    options = options,
    zipfile = None,
    windows=[{"script": "win32test.py"}],
)

三、使用python setup.py py2exe命令来生成安装文件了,要想以后简单些的话写个bat文件,点击这里

四、生成的安装文件可以使用一下命令来执行控制服务:
win32test.exe install
win32test.exe start
win32test.exe stop
win32test.exe remove

或者

sc  create win32test binPath= E:\python\pydev\src\dist\ProductCollectWin32ServiceSetup.exe 

注意上面“=”后面是带空格的

sc start win32test

sc delete win32test

详情请运行 sc --help。

---

1. python打包exe,网上搜的模板,完全够用:

#----bundle_files有效值----
#	3 (默认)不打包。
#	2 打包,但不打包Python解释器。
#	1 打包,包括Python解释器。

#----zipfile的有效值----
#	不填	(默认)生成一个library.zip文件
#	None	把所有东西打包进.exe文件中

from distutils.core import setup
import py2exe


includes = ["encodings", "encodings.*",'decimal'];

options = {
    "py2exe": {"compressed":1,
    "optimize":0,
    "includes":includes,
    "bundle_files":1}
};

setup(
    version = "0.0.1",
    description = "描述",
    name = "程序名",
    options = options,
    zipfile=None,
    windows=[{
        "script": "transferEngergyData.py",
        #"icon_resources": [(1, "logo.ico")],
        "dest_base":"StartLink",    #输出程序的名称,没有此项的话默认为主script的文件名main
        "author": "作者",
        'description':u"程序描述信息",
        'copyright':u'(C) www.company.com Inc.  All rights reserved.', 
        'company_name':u"公司名称"
    }],
	data_files=[("",
				["config.ini", "time.txt"]),  
               ],
)

 2. Q&A

py2exe打包[Q&A]

RuntimeError: Unable to import decimal

http://www.py2exe.org/index.cgi/PyODBC

name '__file__' is not defined

http://www.py2exe.org/index.cgi/WhereAmI

路径设置

 1 def we_are_frozen():
 2     """Returns whether we are frozen via py2exe.
 3     This will affect how we find out where we are located.""" 
 4     
 5     return hasattr(sys, "frozen") 
 6 
 7 def module_path():
 8     """ This will get us the program's directory,
 9     even if we are frozen using py2exe"""
10 
11     if we_are_frozen():
12         return os.path.dirname(unicode(sys.executable, sys.getfilesystemencoding( )))
13 
14     return os.path.dirname(unicode(__file__, sys.getfilesystemencoding( )))
15     
16 current_path = module_path()
17 
18 logger=Logger(logname='%s\\\\log.txt' %current_path,loglevel=1,logger='DataTransmission').getlog()
19 hour_file='%s\\\\time.txt' %current_path
View Code

 

3.指定的服务已经标记为删除

4. 怎样设定windows服务的启动顺序 http://jingyan.baidu.com/article/86f4a73e37381e37d65269b7.html

转载于:https://www.cnblogs.com/Amagasaki/p/3586152.html

<think>我们正在使用Python创建或管理Windows任务计划程序。根据引用[1],我们了解到APScheduler是一个Python定时任务库,但它是在Python环境中运行的调度器,而不是直接管理Windows任务计划(即操作系统的任务计划程序)。用户的需求是直接管理Windows任务计划,因此我们需要使用能够与Windows任务计划程序交互的库。 在Python中,我们可以使用`pywin32`库来操作Windows任务计划程序。`pywin32`提供了对Windows API的访问,包括任务计划程序的COM接口。以下是使用`pywin32`创建Windows任务计划程序任务的基本步骤: 1.连接到任务计划服务。 2.创建或获取一个任务文件夹(通常使用根文件夹)。 3.创建任务定义。4.设置任务的注册信息(如作者、描述等)。5.配置触发器和操作。6.注册任务。下面是一个示例代码,展示如何使用`pywin32`创建一个简单的任务计划任务,该任务每天运行一次,执行一个Python脚本。注意:在运行此代码之前,请确保已安装`pywin32`库(可以通过`pipinstall pywin32`安装)。 ```pythonimport win32com.client#连接到任务计划程序scheduler =win32com.client.Dispatch('Schedule.Service')scheduler.Connect() #获取根任务文件夹root_folder= scheduler.GetFolder('\\') #创建新任务定义task_def =scheduler.NewTask(0)#设置注册信息(作者、描述等) reg_info =task_def.RegistrationInforeg_info.Author= 'YourName'reg_info.Description= 'Runa Pythonscript daily' #设置触发器(每天触发一次)start_time ="2023-01-01T12:00:00"#开始时间,格式为ISO8601triggers= task_def.Triggerstrigger= triggers.Create(2)#2表示每日触发器trigger.StartBoundary= start_timetrigger.DaysInterval=1#每1天触发一次#设置操作(运行一个程序) action= task_def.Actions.Create(0)#0表示执行程序action.Path= 'C:\\Python39\\python.exe'#Python解释器的路径action.Arguments= 'C:\\path\\to\\your_script.py'#要执行的Python脚本#设置任务的其他设置(可选)settings =task_def.Settingssettings.Enabled= Truesettings.StartWhenAvailable =Truesettings.Hidden =False#注册任务(如果任务已存在,则覆盖)TASK_CREATE_OR_UPDATE =6root_folder.RegisterTaskDefinition('YourDaily PythonTask',#任务名称task_def,TASK_CREATE_OR_UPDATE,'',#用户凭据(空表示当前用户)'',#密码0#登录类型(0表示交互式登录,注意安全设置)) print("任务创建成功!")``` 重要说明:1.请将`YourName`替换为你的名字。 2.将`start_time`设置为一个有效的时间(格式为ISO8601,即`YYYY-MM-DDTHH:MM:SS`)。 3.将`action.Path`设置为你的Python解释器的完整路径。 4.将`action.Arguments`设置为你要执行的Python脚本的完整路径。 5.任务名称(`'Your DailyPython Task'`)可以自定义。注意:在Windows上创建任务计划程序任务可能需要管理员权限,因此运行此脚本时可能需要以管理员身份运行。此外,还可以使用`win32com`来管理任务(如删除、更新、列出任务等)。例如,删除任务可以使用`root_folder.DeleteTask`方法。 请根据实际需求调整触发器和操作。触发器类型包括: -1:一次性触发器-2:每日触发器-3:每周触发器-4:每月触发器-5:每月日触发器(每月特定日期)-6:空闲触发器-7:注册时触发器-8:启动时触发器-9:登录时触发器-10:会话状态更改触发器操作类型:-0:执行程序-1:发送电子邮件(需要配置SMTP服务器) -2:显示消息(在用户桌面上显示消息)更多详细配置可以参考Windows任务计划程序的COM接口文档。 ###相关问题1.如何使用Python删除或更新一个已存在的Windows计划任务?2.如何配置Windows计划任务以在特定事件(如系统启动或用户登录)时触发?3.如何设置Windows计划任务以发送电子邮件(使用操作类型1)?4.使用Python管理Windows计划任务时,如何处理用户权限和安全性?</think>### 使用Python创建/管理Windows任务计划程序 要使用Python操作Windows任务计划程序,推荐使用`pywin32`库,它提供了对Windows COM接口的完整访问。以下是实现步骤: #### 1. 安装依赖库 ```bash pip install pywin32 ``` #### 2. 创建基本任务 ```python import win32com.client def create_task(task_name, program_path, trigger_type): # 连接到任务计划服务 scheduler = win32com.client.Dispatch('Schedule.Service') scheduler.Connect() # 获取根文件夹 root_folder = scheduler.GetFolder('\\') # 创建任务定义 task_def = scheduler.NewTask(0) # 设置触发器(示例:每日触发) triggers = task_def.Triggers trigger = triggers.Create(trigger_type) # 1=一次性, 2=每日, 3=每周等 trigger.StartBoundary = "2023-01-01T08:00:00" # ISO格式时间 # 设置操作(运行程序) action = task_def.Actions.Create(0) # 0=执行程序 action.Path = program_path # 注册任务 TASK_CREATE_OR_UPDATE = 6 root_folder.RegisterTaskDefinition( task_name, task_def, TASK_CREATE_OR_UPDATE, "", # 用户名(空表示当前用户) "", # 密码 0 # 登录类型(0=交互式登录) ) # 示例:创建每日运行记事本的任务 create_task("MyPythonTask", "notepad.exe", 2) ``` #### 3. 高级功能实现 ```python # 列出所有任务 def list_tasks(): scheduler = win32com.client.Dispatch('Schedule.Service') scheduler.Connect() root_folder = scheduler.GetFolder('\\') tasks = root_folder.GetTasks(0) return [tasks.Item(i+1).Name for i in range(tasks.Count)] # 删除任务 def delete_task(task_name): scheduler = win32com.client.Dispatch('Schedule.Service') scheduler.Connect() root_folder = scheduler.GetFolder('\\') root_folder.DeleteTask(task_name, 0) # 设置邮件通知(需配合邮件脚本) def set_email_action(task_name, recipient): # ...(使用SMTP库或邮件客户端集成) ``` #### 4. 关键参数说明 | 组件 | 类型值 | 说明 | |------|--------|------| | **触发器类型** | 1 | 一次性 | | | 2 | 每日 | | | 3 | 每周 | | | 4 | 每月 | | **操作类型** | 0 | 运行程序 | | | 1 | 发送邮件 | | | 2 | 显示消息 | #### 5. 注意事项 1. 需要以**管理员权限**运行Python脚本 2. 程序路径需使用**完整绝对路径** 3. 时间格式必须为ISO 8601:`YYYY-MM-DDTHH:MM:SS` 4. 邮件功能需额外实现SMTP集成[^4] > 提示:对于复杂任务调度,可结合APScheduler生成任务列表,再用此方法入系统[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值