前言:
由于项目原因,配置测试环境与正式环境切换频率很高,且环境内容会因不同开发提测而变化,固写了一键切换环境与自定义修改环境内容的工具。用于记录。
一:实现逻辑:
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 \n
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:\Users\Administrator\Desktop\测试.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:\Windows\System32\drivers\etc\') 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 = \'注意事项:\n\' \ 4 \'配置测试前端同时需要绑定以下host:\n\' \ 5 \'106.52.161.190 ********\n\' \ 6 \'111.230.187.70 *********\n\' \ 7 \'82.157.72.135 **********\n\' \ 8 \'\n\' \ 9 \'正式环境需要屏蔽以上的host\n\' \ 10 \'host文件路径:\n\' \ 11 \'C:\Windows\System32\drivers\etc\hosts\n\' \ 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