python 在window对exe、注册表、bat、系统服务操作等实例讲解

news/2024/5/17 19:29:57/文章来源:https://blog.csdn.net/lejian/article/details/132909081

目录

前言:        

1、python准备工作

具体操作实例 

实例1:调用exe文件

实例2:调用bat批处理文件

实例3:调用mis安装文件

实例4: 操作注册表

实例5: window系统服务的操作

 完整代码


前言:        

    正在做的项目已经在中后期,需要一些工具链来节省开发,用python脚本实现自动化工具。以一个我写的python脚本为例,供大家参考。接着要讲的python包含如下内容:调用exe运行程序、调用mis安装文件、和批处理文件,创建、开启、关闭window服务、设置系统变量等。这里就以我做的几个为例,安装Java jdk、redis等作为实例来讲解,以供大家参考。

1、python准备工作

        下载python版本,下载页面:Python Releases for Windows | Python.org,具体怎么安装,请在网上搜索即可,安装python不是本文需要讲的重点。

        选定一个编辑器,当然你可以也不选择,用普通文本编辑或其他编辑器都可以,但是我喜欢用编辑器编辑python代码。我选定的ide是 Pycharm社区版本。

下载python社区版本

        Download PyCharm: Python IDE for Professional Developers by JetBrains

         

具体操作实例 

实例1:调用exe文件

调用exe可执行文件,需要引用subprocess库文件

import subprocess

python函数执行代码如下:

def runExe(path):try:process = subprocess.Popen([path])# 等待程序结束,并获取程序的返回值stdout, stderr = process.communicate()# 判断程序是否正常结束if process.returncode == 0:print(f'运行' + path + '成功')return process.returncodeelse:return process.returncodeexcept Exception as e:print(f'安装'+ path+'异常:'+str(e))return -1

在这里我们用到subprocess库运行exe文件;process.communicate()等待窗关闭,并执行接下来的代码

实例2:调用bat批处理文件

直接运行install_Redis.bat批处理文件

# 安装redis
def install_redis(curr_path):print('开始安装_redis')redis_path = curr_path + '\install\Redis-x64-5.0.14.1\install_Redis.bat'print('redis_path 路径' + redis_path)runBat('redis',redis_path)

这里把调用bat文件直接封装成一个函数,同样需要用到subprocess库,不过等待返回结果是:process.check_returncode()

# 运行批处理,name,定义批处理的名称,批处理curr_path实际的完整路径
def runBat(name, curr_path):print(name + ' 路径' + curr_path)try:process = subprocess.run([curr_path])# 等待程序结束,并获取程序的返回值process.check_returncode()print(process.stdout)# 判断程序是否正常结束if process.returncode == 0:print(f'运行完' + name)else:print(f'程序执行失败,返回值为 {process.returncode}')except Exception as e:print(f'运行bat文件%s,发生异常 %s' % (curr_path, str(e)))

实例3:调用mis安装文件

        调用mis文件与调用exe文件他们同样需要使用subprocess库,但是有些许的不同,主要表现在subprocess.Popen的参数上和返回值上,具体看如下代码:

# 安装mongodb
def install_mongodb(curr_path):print(f'开始安装_mongodb')mongdb_path = curr_path + r'\install\mongodb-win32-x86_64-2012plus-4.2.17-signed.msi'print(f'mongdb_path 路径' + mongdb_path)try:process = subprocess.Popen(['msiexec', '/i', mongdb_path])# 等待程序结束,并获取程序的返回值while True:if process.poll() is not None:print(mongdb_path + ' 文件执行完毕')break;except Exception as e:print(f'安装mongodb 失败 %s ' % str(e))

这里subprocess.Popen用到参数数组['msiexec', '/i', mongdb_path] 

实例4: 操作注册表

操作注册表我们需要引用的库为winreg

import winreg

实例代码如下:

# 设置注册表信息
def setWinregKey(regKey, path):print(f'创建 {regKey} 环境变量')# 打开注册表key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Environment', 0, winreg.KEY_ALL_ACCESS)# 添加环境变量winreg.SetValueEx(key, regKey, 0, winreg.REG_SZ, path)winreg.FlushKey(key)winreg.CloseKey(key)

实例5: window系统服务的操作

对于window服务,同样我们需要用到subprocess库,以我自己注册zookeeper服务为例

# 安装 zookeeper,并启动zookeeper服务
def install_zookeeper(curr_path):print(f'创建zookeeper环境变量')setWinregKey('ZOOKEEPER_HOME', curr_path + r'\install\zookeeper\apache-zookeeper-3.7.0-bin')setWinregKey('ZOOKEEPER_SERVICE', 'zookeeper_service')try:if service_exists('zookeeper_service'):cmdRun(['net', 'stop', 'zookeeper_service'])cmdRun(['sc', 'delete', 'zookeeper_service'])runBat('zookeeper', curr_path + r'\install\zookeeper' + r'\apache-zookeeper-3.7.0-bin\bin\Install.bat')cmdRun(['net', "start", 'zookeeper_service'])except Exception as e:print(u'%s' % (str(e)))

该函数功能是:判断zookeeper服务是否存在,如果存在,关闭并删除,并启动bat文件注册zookeeper服务,并启动zookeeper服务 

 自己定义的函数:

运行cmd单条命令函数processRun:

# 执行cmd命令,如:开启服务 window服务net start zookeeper_service
def cmdRun(args):try:ret = subprocess.run(args, check=True)# ret.returncode 返回int类型,0 则执行成功ret.check_returncode()print('ret.returncode: %d' % ret.returncode)print('ret.stdout: %s' % ret.stdout)except Exception as e:print(f'运行命令 %s 发生异常' % (str(e)))

判断服务是否存在函数:

        通过sc query [service_name]命令查询服务器是否存在

# 判断服务是否存在
def service_exists(service_name):try:subprocess.check_output(['sc', 'query', service_name])return Trueexcept subprocess.CalledProcessError:return False

 完整代码

        最后这里给出完整代码供大家作个简单的参考,可能有些遗漏或有瑕疵的地方,这里主要是抛砖引玉。

# -*- coding: utf-8 -*-
# This is a sample Python script.# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
# encoding=utf-8
import os
import subprocess
import winreg# See PyCharm help at https://www.jetbrains.com/help/pycharm/# 获得当前路径
def getCurrentDir():file_path = os.path.abspath(__file__)dir_path = os.path.dirname(file_path)return dir_pathdef installServer(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.curr_path = getCurrentDir()print(getCurrentDir())# install_java_sdk(curr_path)# install_redis(curr_path)# install_mongodb(curr_path)install_zookeeper(curr_path)# install_idea(curr_path)def install_java_sdk(curr_path):print(f'开始安装java sdk')jdk = curr_path + r'\install\jdk-11.0.11_windows-x64_bin.exe'print(f'jdk 路径' + jdk)try:returnCode = runExe(jdk)# 判断程序是否正常结束if returnCode == 0:print(f'创建java sdk环境变量')# 打开注册表key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Environment', 0, winreg.KEY_ALL_ACCESS)# 添加环境变量winreg.SetValueEx(key, 'JAVA_HOME', 0, winreg.REG_SZ, 'C:\Program Files\Java\jdk-11.0.11')# 关闭注册表winreg.CloseKey(key)else:print(f'程序执行失败,返回值为')except Exception as e:print('安装java sdk 异常 %s 结束安装' % str(e))# 安装mongodb
def install_mongodb(curr_path):print(f'开始安装_mongodb')mongdb_path = curr_path + r'\install\mongodb-win32-x86_64-2012plus-4.2.17-signed.msi'print(f'mongdb_path 路径' + mongdb_path)try:process = subprocess.Popen(['msiexec', '/i', mongdb_path])# 等待程序结束,并获取程序的返回值while True:if process.poll() is not None:print(mongdb_path + ' 文件执行完毕')break;except Exception as e:print(f'安装mongodb 失败 %s ' % str(e))# 安装redis
def install_redis(curr_path):print('开始安装_redis')redis_path = curr_path + '\install\Redis-x64-5.0.14.1\install_Redis.bat'print('redis_path 路径' + redis_path)runBat('redis',redis_path)# 判断服务是否存在
def service_exists(service_name):try:subprocess.check_output(['sc', 'query', service_name])return Trueexcept subprocess.CalledProcessError:return False# 安装 zookeeper,并启动zookeeper服务
def install_zookeeper(curr_path):print(f'创建zookeeper环境变量')setWinregKey('ZOOKEEPER_HOME', curr_path + r'\install\zookeeper\apache-zookeeper-3.7.0-bin')setWinregKey('ZOOKEEPER_SERVICE', 'zookeeper_service')try:if service_exists('zookeeper_service'):cmdRun(['net', 'stop', 'zookeeper_service'])cmdRun(['sc', 'delete', 'zookeeper_service'])runBat('zookeeper', curr_path + r'\install\zookeeper' + r'\apache-zookeeper-3.7.0-bin\bin\Install.bat')cmdRun(['net', "start", 'zookeeper_service'])except Exception as e:print(u'%s' % (str(e)))def install_idea(curr_path):print(f'开始安装 idea')idea = curr_path + r'\install\ideaIU-2019.3.4\ideaIU-2019.3.4.exe'print(f'idea 路径' + idea)runExe(idea)# 执行cmd命令,如:开启服务 window服务net start zookeeper_service
def cmdRun(args):try:ret = subprocess.run(args, check=True)# ret.returncode 返回int类型,0 则执行成功ret.check_returncode()print('ret.returncode: %d' % ret.returncode)print('ret.stdout: %s' % ret.stdout)except Exception as e:print(f'运行命令 %s 发生异常' % (str(e)))def runExe(path):try:process = subprocess.Popen([path])# 等待程序结束,并获取程序的返回值stdout, stderr = process.communicate()# 判断程序是否正常结束if process.returncode == 0:print(f'运行' + path + '成功')return process.returncodeelse:return process.returncodeexcept Exception as e:print(f'安装'+ path+'异常:'+str(e))return -1# 设置注册表信息
def setWinregKey(regKey, path):print(f'创建 {regKey} 环境变量')# 打开注册表key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Environment', 0, winreg.KEY_ALL_ACCESS)# 添加环境变量winreg.SetValueEx(key, regKey, 0, winreg.REG_SZ, path)winreg.FlushKey(key)winreg.CloseKey(key)# 运行批处理,name,定义批处理的名称,批处理curr_path实际的完整路径
def runBat(name, curr_path):print(name + ' 路径' + curr_path)try:process = subprocess.run([curr_path])# 等待程序结束,并获取程序的返回值process.check_returncode()print(process.stdout)# 判断程序是否正常结束if process.returncode == 0:print(f'运行完' + name)else:print(f'程序执行失败,返回值为 {process.returncode}')except Exception as e:print(f'运行bat文件%s,发生异常 %s' % (curr_path, str(e)))# Press the green button in the gutter to run the script.
if __name__ == '__main__':installServer('install')

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_558460.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础 C++

C语言基础 C 嘿,你想起点C基础知识,这是一个很好的开始!C是一种通用的编程语言,被广泛用于开发各种应用程序,从简单的控制台程序到复杂的桌面应用和游戏开发。现在让我带你进入C的奇妙世界,看看它有什么特…

使用 Splashtop 驾驭未来媒体和娱乐

在当今时代,数字转型不再是可选项,而是必选项。如今,媒体与娱乐业处于关键时刻,正在错综复杂的创意、技术和远程协作迷宫之中摸索前进。过去几年发生的全球事件影响了我们的日常生活,不可逆转地改变了行业的运作方式&a…

Maven 环境配置

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。 系统要求 项目 要求 JDK Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 内存 没有最低要求 磁盘 Maven 自身安装需要大约 10 MB 空间…

433/315无线接收芯片XL710,适合各种低功耗要求的设备等

XL710是一款高集成度、低功耗的单片ASK/OOK射频接收芯片。高频信号接收功能全部集成于片内以达到用最少的外围器件和最低的成本获得最可靠的接收效果。因此它是真正意义.上的“无线高频调制信号输入,数字解调信号输出”的单片接收器件。 XL710为SOP8封装&#xff0…

基于SpringBoot的音乐网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 歌曲分类管理 歌曲信息管理 轮播图管理 歌曲信息 歌曲评论 用户注册 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施…

SonarQube学习笔记三:直接使用sonar-scanner扫描器

目录 1.安装Sanner扫描器2.环境变量配置3.创建项目3.1 登录并创建项目3.2 输入项目名称信息3.3 选择分析仓库类型3.4 创建令牌3.5 保存令牌(非必须)3.6 选择构建技术方案3.6.1 .Net类项目3.6.2 Java类项目 3.7 获取Sonar检查结果3.8 在页面查看检查结果或…

触控笔有必要买吗?便宜好用的手写笔推荐

电容笔不仅可以用于学习上,还能用于工作上,可见它的重要性。自从苹果发布了一款适合ipad使用的电容笔之后,这款电容笔立即就火遍了整个市面,只不过由于Apple Pencil的售价太高,大部分人都买不起。于是,市面…

ThreeJS-3D教学八-OBJLoader模型加载+动画

先看效果图: 本篇给大家介绍下模型加载的知识,用到了OBJLoader对应的模型,为了增加趣味性,花了些时间,利用new THREE.Points获取到模型上的点,做了一个动画效果,其实就是操作 Y轴上的点&#x…

JavaScript 编写一个 数值转换函数 万以后简化 例如1000000 展示为 100万 万以下原来数值返回

很多时候 我们看一些系统 能够比较只能的展示过大的数值 例如 到万了 他就能展示出 多少 多少万 看着很奇妙 但实现确实非常的基础 我们只需要一个这样的函数 //数值转换函数 convertNumberToString(num) {//如果传入的数值 不是数字 且也无法转为数字 直接扔0回去if (!parse…

在asp.net中,实现类似安卓界面toast的方法(附更多弹窗样式)

目录 一、背景 二、操作方法 2.1修改前 2.2修改后 三、总结 附:参考文章: 一、背景 最近在以前的asp.net网页中,每次点击确定都弹窗,然后还要弹窗点击确认,太麻烦了,这次想升级一下,实现…

10分钟深入探讨带你彻底理解浅拷贝与深拷贝

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言 📘 1. 深拷贝…

vue3+ts项目04-国际化

yarn add vue-i18n yarn add js-cookie yarn add types/js-cookiesrc下新建i18n文件夹,该文件夹下新建lang和pages文件夹, lang文件夹下新建en.ts // 定义内容 export default {router: {home: home,system: {system: system,menu: systemMenu,role: sy…

Pymol做B因子图

分子动力学模拟结束后,获得蛋白的平均结构, 比如获得的平均结构为WT-average.pdb 然后将平均结构导入到Pymol 中,可以得到B因子图。 gmx rmsf -f md_0_100_noPBC.xtc -s md_0_100.tpr -o rmsf-per-residue.xvg -ox average.pdb -oq bfactors…

Android App备案获取公钥、签名MD5值

1.生成签名文件 keytool -genkey -alias 别名XXX -keypass 密码XXX -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\XXX.keystore -storepass 密码XXX2.查看签名MD5值 keytool -list -v -keystore D:\XXX.keystore3.查看公钥 导出证书XXX.cer keytool -export -a…

vue接入高德地图获取经纬度

&#x1f90d;step1:高德地图开放平台&#xff0c;根据指引注册成为高德开放平台开发者&#xff0c;并申请 web 平台&#xff08;JS API&#xff09;的 key 和安全密钥; &#x1f90d;step2:在html引入安全密钥&#xff08;获取经纬度用&#xff0c;不然会报错&#xff09; <…

uniapp上echarts地图钻取

1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…

spring 事务源码阅读之实现原理

开启事务 使用EnableTransactionManagement注解开启事务 该注解会引入TransactionManagementConfigurationSelector类&#xff0c;然后该类导入两个类AutoProxyRegistrar和ProxyTransactionManagementConfiguration。 1、添加bean后置处理器 AutoProxyRegistrar类的作用是注…

大数据学习(2)Hadoop-分布式资源计算hive(1)

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

前端uniapp生成海报并保存相册

uiapp插件 目录 图片qrcode.vue源码完整版封装源码qrcodeSwiper.vue最后 图片 qrcode.vue源码完整版 <template><view class"qrcode"><div class"qrcode_swiper SourceHanSansSC-Normal"><!-- <cc-scroolCard :dataInfo"dat…

10-09 周一 图解机器学习之深度学习感知机学习

10-09 周一 图解机器学习之深度学习感知机学习 时间版本修改人描述2023年10月9日14:13:20V0.1宋全恒新建文档 简介 感知机是神经网络中的概念&#xff0c;1958年被Frank Rosenblatt第一次引入。感知机作为一种基本的神经网络模型&#xff0c;它模拟了人脑神经元的工作原理。感…