問題引入:
寫自動化測試工具的時候, 用了thinter實現簡單的界面,以實現,交互顯示和設置配置項,顯示動態測試過程中日誌,“開始測試”按鈕觸發這個整個自動化測試流程。
因爲整個自動化測試是測試的【一個客戶端】,中間是會底層利用win32api啓動【這個客戶端】的。
最後發現:當整個測試完成後,按X按鈕關閉測試UI的時候,需測試的客戶端又被啓動了。 看日誌發現是,整個測試流程又開始走一遍。 最後發現是if __name__=="__main__"引起的。
詳細說下:
如上圖所以問題。在pychorm中並不會出現問題,只有當打包編譯成exe後運行,關閉UI後出現重複運行的情況。
問題驗證:
創建文件mymain.py(相當於上面畫圖舉例的文件a.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/8/28 16:25
# @Author : lishenluo
import threading
import mytt
from tkinter import *
def ui_start():
win = Tk()
# 設置標題
win.title("我是測試")
win.geometry("300x200+100+100")
button = Button(win, text='我是按鈕', font=('Arial', 12), width=12, height=1, command=button_function)
button.pack()
win.mainloop()
def button_function():
th = threading.Thread(target=mytt.start, args=())
th.start()
if __name__=="__main__":
ui_start()
創建文件mytt.py(相當於上面畫圖舉例的文件b.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/8/28 16:24
# @Author : lishenluo
import logging
logging.basicConfig(filename="test.log", filemode="w",
format="[%(asctime)s][%(name)s][%(levelname)s]%(message)s",
datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG)
logging.info("this is before if __name__:%s"%__name__)
def start():
logging.info("你是大笨蛋") #整個自動化測試開始入口函數
if __name__=='__main__':
start()
logging.info("this is after if __name__:%s"%__name__)
在pycharm運行結果,X關閉窗口後日志也不變,說明沒有多餘的運行。
利用pyinstaller編譯出exe,對應mymain.spec文件如下
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['mymain.py','mytt.py'],
pathex=['E:\\JQCode\\jqtests\\threadUiTest'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='threadUITest',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='threadUITest')
利用cmd,去到對應目錄下,編譯出exe文件
最後pycharm代碼目錄結構,編譯出的exe文件在dist下
運行並查看日誌: