当前位置: 首页 > article >正文

pywinauto自动安装python和java

视频连接:auto_install_py_java-CSDN直播

pywinauto 是一个用于自动化 Windows 图形用户界面(GUI)的 Python 库,支持通过程序控制窗口、按钮、输入框等控件,适用于自动化测试、批量操作和任务脚本化。

代码如下:

import platform
import os
import subprocess
from pywinauto.application import Application
import time
import psutil
import ctypes
import sys
import winreg


def check_win32_64():
    machine = platform.machine()
    system = platform.system()

    if system.lower() != 'windows':
        return '不是Windows系统'
    if machine.endswith('64'):
        return '不是64位系统'


def check_python_java():
    p_j = {'python': 0, 'java': 0}
    ret = subprocess.run(['python', '--version'], capture_output=True, text=True)
    status_code = ret.returncode
    if 0 == status_code:
        p_j['python'] = 1
    ret = subprocess.run(['java', '-version'], capture_output=True, text=True)
    status_code = ret.returncode
    if 0 == status_code:
        p_j['java'] = 1


def find_python_pid(python):
    install_file = os.path.join(os.getcwd(), 'resource', python)
    before = {p.pid for p in psutil.process_iter()}
    # 启动安装程序
    ret = subprocess.Popen(install_file)
    time.sleep(2)  # 等待进程启动
    after = {p.pid for p in psutil.process_iter()}
    new_pids = after - before
    new_pids = new_pids - {ret.pid}
    for pid in new_pids:
        p_name = psutil.Process(pid).name()
        if p_name == python:
            python_id = pid
            return python_id


def find_java_pid(java):

    # 设置管理员权限
    def is_admin():
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False

    is_admin()
    if not is_admin():
        ctypes.windll.shell32.ShellExecuteW(
            None, "runas", sys.executable, " ".join(sys.argv), None, 1
        )
        sys.exit()

    install_file = os.path.join(os.getcwd(), 'resource', java)
    before = {p.pid for p in psutil.process_iter()}
    # 启动安装程序
    ret = subprocess.Popen(install_file)
    time.sleep(2)  # 等待进程启动
    after = {p.pid for p in psutil.process_iter()}
    new_pids = after - before
    new_pids = new_pids - {ret.pid}
    for pid in new_pids:
        p_name = psutil.Process(pid).name()
        if p_name == java:
            java_id = pid
            return java_id

def auto_install(install_path, soft=''):
    """
    :param install_path: exe文件路径
    :param soft:   'python'  or 'java'
    :return:
    """

    def find_soft_pid(install_path, soft=''):
        install_file = os.path.join(os.getcwd(), 'resource', install_path)
        before = {p.pid for p in psutil.process_iter()}
        # 启动安装程序
        ret = subprocess.Popen(install_file)
        # print(ret.pid)
        time.sleep(2)  # 等待进程启动
        after = {p.pid for p in psutil.process_iter()}
        new_pids = after - before
        new_pids = new_pids - {ret.pid}
        for pid in new_pids:
            p_name = psutil.Process(pid).name()
            if p_name == soft:
                python_id = pid
                return python_id

    find_soft_pid(install_path, soft)


def install_java(java='jre-8u441-windows-x64.exe'):
    install_dir = "D:\\java_jre"
    dir_name = install_dir.split('\\')[-1]
    if not os.path.exists(install_dir):
        os.mkdir(install_dir)
    time.sleep(0.1)
    java_id = find_java_pid(java)
    app = Application(backend='uia').connect(process=java_id)
    # app.wait('ready',timeout=10)
    time.sleep(1)
    dlg_install = app.window(title_re='Java')
    dlg_install.wait("visible", timeout=10)
    dlg_install.child_window(title="更改目标文件夹", auto_id="changeFolderCtrl", control_type="CheckBox").click_input()
    time.sleep(0.1)
    dlg_install.child_window(title="安装", auto_id="installBtn", control_type="Button").click()
    # time.sleep(1)
    dlg_install.child_window(title="更改(C)...", auto_id="changeFolderBtn", control_type="Button").click()
    D_dist = dlg_install.child_window(title_re=".*D:.*", control_type="TreeItem")
    D_dist.double_click_input()

    dlg_install.child_window(title=dir_name, control_type="TreeItem").select()

    time.sleep(0.1)
    dlg_install.child_window(title="确定", control_type="Button").click_input()
    # dlg_install.print_control_identifiers()
    time.sleep(0.5)
    dlg_install.child_window(title="下一步(N) >", auto_id="nextBtn", control_type="Button").click()
    java_add_path(install_dir)

    while psutil.pid_exists(java_id):
        pass


def java_add_path(jre_path):
    try:
        # 1. 设置 JAVA_HOME
        key = winreg.OpenKey(
            winreg.HKEY_LOCAL_MACHINE,
            r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
            0, winreg.KEY_SET_VALUE | winreg.KEY_WOW64_64KEY
        )
        winreg.SetValueEx(key, "JAVA_HOME", 0, winreg.REG_EXPAND_SZ, jre_path)
        winreg.CloseKey(key)

        # 2. 更新系统 Path
        key = winreg.OpenKey(
            winreg.HKEY_LOCAL_MACHINE,
            r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
            0, winreg.KEY_QUERY_VALUE | winreg.KEY_SET_VALUE | winreg.KEY_WOW64_64KEY
        )
        path_value, _ = winreg.QueryValueEx(key, "Path")
        # print(path_value)
        new_path = f"{path_value};%JAVA_HOME%\\bin"
        winreg.SetValueEx(key, "Path", 0, winreg.REG_EXPAND_SZ, new_path)
        winreg.CloseKey(key)

    except Exception:
        pass


def install_python(python='python-3.9.5-amd64.exe'):
    install_dir = "D:\\Python3.9"
    if not os.path.exists(install_dir):
        os.mkdir(install_dir)
    py_id = find_python_pid(python)
    app = Application(backend='uia').connect(process=py_id)
    dlg_install = app.window(title_re='Python')
    # dlg_install.print_control_identifiers()
    add_path = dlg_install.child_window(title="Add Python 3.9 to PATH", control_type="CheckBox")
    add_path.click_input()
    time.sleep(0.1)

    cust_install = dlg_install.child_window(title="Customize installation", control_type="Button")
    cust_install.click()
    # time.sleep(1)

    dlg_install.child_window(title="Next", control_type="Button").click()
    # time.sleep(1)
    dlg_install.child_window(title="Customize install location", auto_id="1033", control_type="Edit").set_edit_text(
        install_dir)

    dlg_install.child_window(title="Install", control_type="Button").click()

    while psutil.pid_exists(py_id):
        pass


if __name__ == "__main__":
    install_java()
    time.sleep(1)
    install_python()


http://www.kler.cn/a/587508.html

相关文章:

  • DaVinci Resolve(达芬奇)快捷键大全
  • MySQL中的回表是什么?
  • Gin(后端)和 Vue3(前端)中实现 Server-Sent Events(SSE)推送
  • [Jenkins] 即将关闭,剩余生成将不会被执行问题解决
  • 支付宝小程序评论提升策略:打造高互动度的用户体验
  • 【NLP】 3. Distributional Similarity in NLP(分布式相似性)
  • 责任链模式如何减少模块之间的耦合
  • starrocks批量启停脚本
  • 生成对抗网络——pytorch与paddle实现生成对抗网络
  • WordPress顶部菜单自定义的方法
  • 酒店宾馆IPTV数字电视系统:创新宾客体验,引领智慧服务新潮流
  • 【蓝桥】模拟
  • Spring Boot整合RabbitMQ极简教程
  • 【小沐学Web3D】three.js 加载三维模型(React)
  • 微信小程序wx.request接口报错(errno: 600001, errMsg: “request:fail -2:net::ERR_FAILED“)
  • 有效封装一个 WebSocket 供全局使用
  • Vue 中如何实现自定义指令?
  • 《DeepSeek 开源 DeepGEMM:开启AI计算新时代的密钥》:此文为AI自动生成
  • 变量赋值汇编
  • 【C】嵌入式的中断,理解