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