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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值