前言:
由于项目原因,配置测试环境与正式环境切换频率很高,且环境内容会因不同开发提测而变化,固写了一键切换环境与自定义修改环境内容的工具。用于记录。
一:实现逻辑:
1、读取注册表中客户端的安装目录,把通用的环境配置文件添加到固定目录下实现配置测试环境;
2、通过读取注册表中客户端的安装目录,遍历固定目录下的文件,删除环境文件实现恢复正式环境;
3、配置了测试环境后,遍历找到文件,调用电脑记事本打开文件,进行自定义环境配置;
4、测试环境需要搭配host,找到hosts文件,实现自定义修改host;
5、通过PYQT5实现gui界面调用函数,自由切换、修改环境;
二:代码实现:
以下是各函数定义
定义窗体样式及大小
1 def initUI(self): 2 # 窗口大小 3 self.setWindowTitle('前端环境配置') 4 self.setGeometry(400,400,410,300) 5 6 # 文本框与按钮设置 7 self.textbox = QTextEdit(self) 8 self.textbox.setPlainText(self.text_tips) 9 self.textbox.setStyleSheet(' border: 0px solid #1C72DD; font-size:14px; font-family: Microsoft
YaHei;color: #333333;font-weight : bold;') 10 self.textbox.move(30, 15) 11 self.textbox.resize(350, 160) 12 13 self.btn1 = QPushButton('测试环境通用版',self) 14 self.btn1.move(60,190) 15 16 self.btn2 = QPushButton('正式环境',self) 17 self.btn2.move(220,190) 18 19 self.btn3 = QPushButton('自定义ini文件', self) 20 self.btn3.move(60, 240) 21 22 self.btn4 = QPushButton('自定义host文件', self) 23 self.btn4.move(220, 240) 24 25 # 按钮点击行为 26 self.one = self.btn1.clicked.connect(self.buttonClicked_1) 27 self.two = self.btn2.clicked.connect(self.buttonClicked_2) 28 self.three = self.btn3.clicked.connect(self.buttonClicked_3) 29 self.four = self.btn4.clicked.connect(self.buttonClicked_4)
获取注册表中客户端的安装路径
1 def get_Installation_path(self): 2 # 根据键的路径打印key值 3 key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 4 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\kdesk', 0, 5 win32con.KEY_READ) 6 7 # 打印该路径下的某个键值 8 key_vule = win32api.RegQueryValueEx(key, "InstallLocation") 9 # 元组转换成列表,删除多余元素。获取客户端安装路径 10 self.key_vule_new = list(key_vule).pop(0) 11 self.key_vule_pak = self.key_vule_new + 'cef' 12 self.key_vule_ini = self.key_vule_new + 'data'
配置测试环境以及错误弹框的提示
1 def get_pak_ini_path(self): 2 # path_txt = r'C:UsersAdministratorDesktop测试.txt' # 在路径前面加r,即保持字符原始值的意思。 3 self.get_Installation_path() 4 dir_or_inifiles = [] 5 dir_or_pakfiles = [] 6 dir_or_inifiles = os.listdir(self.key_vule_ini) 7 dir_or_pakfiles = os.listdir(self.key_vule_pak) 8 # 判断ini是否存在,如存在点击弹窗提示,避免重复点击操作 9 for ini in dir_or_inifiles: 10 ini_filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini') 11 if os.path.isfile(ini_filepath): 12 QtWidgets.QMessageBox.critical(self, '提示', '当前已是测试环境前端') 13 break 14 else: 15 pass 16 # 判断pak是否存在,如存在则只添加部署ini,否则两者都部署(当客户端开启,重复添加会导致工具退出,因pak依赖客户端,开启状态不能添加删除pak) 17 for pak in dir_or_pakfiles: 18 pak_filepath = os.path.join(self.key_vule_pak, 'devtools_resources.pak') 19 if os.path.isfile(pak_filepath): 20 if os.path.exists(r'./wallpaperurl.ini'): 21 shutil.copy(r'./wallpaperurl.ini', self.key_vule_ini) 22 else: 23 QtWidgets.QMessageBox.critical(self, '提示', '工具目录下无ini后缀文件') 24 else: 25 if os.path.exists(r'./devtools_resources.pak'): 26 shutil.copy(r'./devtools_resources.pak', self.key_vule_pak) 27 else: 28 QtWidgets.QMessageBox.critical(self, '提示', '工具目录下无pak后缀文件')
配置正式环境以及错误弹窗提示
1 def del_pak_ini_path(self): 2 self.get_Installation_path() 3 dir_or_files = [] 4 dir_or_files = os.listdir(self.key_vule_ini) 5 6 for f in dir_or_files: 7 filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini') 8 if os.path.isfile(filepath): 9 os.remove(filepath) 10 break 11 else: 12 QtWidgets.QMessageBox.critical(self, '提示', '当前已是正式环境前端') 13 break
调用系统文本,自定义ini环境文件
1 def custom_pak_ini_path(self): 2 self.get_Installation_path() 3 dir_or_files = [] 4 dir_or_files = os.listdir(self.key_vule_ini) 5 6 for i in dir_or_files: 7 filepath = os.path.join(self.key_vule_ini, 'wallpaperurl.ini') 8 if os.path.isfile(filepath): 9 # 调用记事本打开ini文件 10 win32api.ShellExecute(0, 'open', 'notepad.exe', filepath, '', 1) 11 break 12 else: 13 # 弹窗提示目录下无ini文件 14 QtWidgets.QMessageBox.critical(self,'提示','data路径无ini后缀文件,请先配置测试环境') 15 break
调用系统文本,自定义修改hosts文件
1 def custom_pak_hosts_path(self): 2 dir_or_files = [] 3 dir_or_files = os.listdir('C:WindowsSystem32driversetc') 4 5 for host_path in dir_or_files: 6 host_path = 'C:/Windows/System32/drivers/etc/hosts' 7 if os.path.isfile(host_path): 8 # 调用记事本打开ini文件 9 win32api.ShellExecute(0, 'open', 'notepad.exe', host_path, '', 1) 10 break 11 else: 12 # 弹窗提示目录下无ini文件 13 QtWidgets.QMessageBox.critical(self, '提示', 'etc路径无hosts文件,请先创建该文件') 14 break
定义按钮事件
1 def buttonClicked_1(self): 2 sender = self.sender() 3 # 引用函数 4 self.initUI() 5 # 按钮调用操作函数 6 self.one = self.get_pak_ini_path() 7 self.statusBar().showMessage(sender.text()+''+ '已点击')
窗口提示内容
1 def __init__(self): 2 super().__init__() 3 self.text_tips = '注意事项: ' 4 '配置测试前端同时需要绑定以下host: ' 5 '106.52.161.190 ******** ' 6 '111.230.187.70 ********* ' 7 '82.157.72.135 ********** ' 8 ' ' 9 '正式环境需要屏蔽以上的host ' 10 'host文件路径: ' 11 'C:WindowsSystem32driversetchosts ' 12 13 self.initUI()
创建应用及对象
1 if __name__ == '__main__': 2 app = QtWidgets.QApplication(sys.argv) 3 ui = MainWindow() 4 ui.show() 5 sys.exit(app.exec_())
三:建议:
我之前是写成两个文件,执行A文件调用B文件封装方法的逻辑实现。在调试的时候是没问题的,但是在打exe包的时候出现了报错。后根据报错信息,把两个文件写成一个去执行,完美解决。
所以建议不想复杂的话可以写成一个文件,如果是大佬的话,随意~
四:打包exe工具包传送门:https://www.cnblogs.com/jc-home/p/14448192.html