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

news2024/10/6 12:32:07

目录

前言:        

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.returncode
        else:
            return process.returncode

    except 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 True
    except 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_path


def 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 True
    except 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.returncode
        else:
            return process.returncode

    except 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.coloradmin.cn/o/1076993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原生JS-鼠标拖动

原生JS-鼠标拖动 通过鼠标的点击事件通过h5的属性 通过鼠标的点击事件 步骤: 1. 鼠标按下div。 2. 鼠标移动,div跟着移动 原生js,实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候,开始监听鼠标…

安达发|制造业的新趋势:APS排程软件的广泛应用

近年来,随着科技的快速发展,制造业也在逐步实现智能化、自动化。其中,APS排程软件的应用越来越广泛,成为制造业提高生产效率、降低运营成本的重要工具。本文将深入探讨这一现象背后的原因。 制造业是全球经济的重要支柱&#xff0…

pygame简单实现游戏开始菜单

最终效果: 完整视频: pygame简单实现菜单 Code: settings.py RESWIDTH,HEIGHT800,600 FPS60main.py import pygame as pg from settings import * import sysclass Game:def __init__(self):pg.init()self.screenpg.display.set_mode(RES)…

浏览器中XPath的使用

概念 XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。 XPath定位在爬虫和自动化测试中都比较常用,通过使用路径表达式来选取 XML 文档中的节点或者节点集,熟练掌握XPath可以极大提…

生成多元正态数据

目录 一、mvrnorm()函数使用介绍 例1:生成服从多元正态分布的数据 例2:生成一组服从多元正态分布的观测 一、mvrnorm()函数使用介绍 获取来自给定均值向量和协方差阵的多元正态分布的数据。 MASS包中的mvrnorm()函数可以让这个问题变得很容易,其调用…

Visual Leak Detector内存泄漏检测机制源码剖析

VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…

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

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

阿里春招JAVA后端面试总结

阿里巴巴春招的后端面经,问了比较多的计算机基础和数据库的内容。 操作系统 一个操作系统,我们在衡量它的内存占用的时候,它一般会有哪些内存的部分? 答:堆和栈 补充: 这个其实是问你对free命令的理解。 主机的内存做一些清理的动作。你知道这里面会涉及到对哪些…

三、监控搭建-Prometheus-grafana部署

三、监控搭建-Prometheus-grafana部署 1、背景2、目标3、传承4、操作 1、背景 在前两篇中介绍了部署prometheus平台和主机采集端部署,都是采用的单查询信息检索,不是太直观 2、目标 实现可视化查看 3、传承 本篇操作依赖[《监控搭建-Prometheus》 和…

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…

猫头虎博主第六期赠书活动:《手机摄影短视频和后期从小白到高手》

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

iOS 17又爆WiFi连接定期断开问题,可尝试这几种解决办法!

从刮痕、掉漆、镜头进灰,再到机型过热烧屏,这届苹果iPhone 15存在的问题还真不少! 近日又有用户反馈称他们在 iOS 17 上遇到了 Wi-Fi 问题,这一问题在 iPhone 15系列机型上尤其严重。具体表现在Wi-Fi 在 iPhone 15 Pro 上会定期断…

腾讯云 轻量云 上海 VPS 测评

description: 发布于 2023-07-05腾讯云 轻量云 上海 VPS 测评 腾讯云国内机非常稳定,一年用下来没有掉线丢包的情况。国内机适合与备案域名一起建站使用。带宽很小,图片资源使用CDN加速或海外机提供。 规格 CPU - 2核 内存 - 2GB 系统盘 - SSD云硬盘…

Linux:redis数据库源码包安装

介绍 1.关系数据库与非关系型数据库 1.1关系型数据库 1)一个结构化的数据库,创建在关系模型基础上,一般面向于记录 2)包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等 非关系型数据库 1)除了主流的关系型数据库以外的数据库,都认为是…

PTA 7-6 盲盒包装流水线(单调栈)

题目 众所周知,PAT 有 9 枚徽章,分别对应青铜、白银、黄金、白金、钻石、大师、王者、大圣、天神这 9 个段位,只有成绩非常优秀的考生才有资格获得刻有自己名字的徽章。现在,PAT 制作了徽章的小型纪念版,要制成盲盒给…

SpringbootWeb快速入门

1. 创建新项目,并勾选相关依赖 选中Spring Initializr,设置相关项 点击next选中spring web 点击create 2. 定义HelloController类,添加方法和注解 import org.springframework.web.bind.annotation.RequestMapping;: 这一行导入了Spring MVC…

实际开发中常用的Git操作

文章目录 前言基础知识集中式版本控制 - SVN分布式版本控制 - Git常用的Linux命令Git工作区域 Git 常用命令获取Git仓库添加/提交/推送/删除/回退文件查看信息Git分支Git标签Gitk:一个排查Git问题的工具 前言 git是用C语言开发的,以追求最高的性能。git…

GEO生信数据挖掘(六)实践案例——四分类结核病基因数据预处理分析

前面五节,我们使用阿尔兹海默症数据做了一个数据预处理案例,包括如下内容: GEO生信数据挖掘(一)数据集下载和初步观察 GEO生信数据挖掘(二)下载基因芯片平台文件及注释 GEO生信数据挖掘&…

香港服务器在大陆连不上怎么回事?

众所周知,香港服务器与中国内地的网络连通性是比较好的,不仅是机房地理距离的加持,还有就是利用CN2 GIABGP高速线路,参考恒创科技香港服务器访问内地网站,无需绕国际线路转换再到大陆,访问速度会比较快。但…

几行cmd命令,轻松将java文件打包成jar文件

1. 在任意目录下建立一个.java文件 2. 在当前目录下使用cmd命令: javac filename编译 如果报错则使用此命令javac -encoding UTF-8 filename 3.此时已成功生成.class文件 4. 可以手动添加MANIFEST.MF文件 Manifest-Version: 1.0 Main-Class: fileName 5.直接一…