前言:
由於項目原因,配置測試環境與正式環境切換頻率很高,且環境內容會因不同開發提測而變化,固寫了一鍵切換環境與自定義修改環境內容的工具。用於記錄。
一:實現邏輯:
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