打包多文件為exe
讀取不到ui文件解決方法來自欽卓大佬的指點
目錄結(jié)構(gòu)
這幾個打馬賽克是打包時出現(xiàn)的文件目錄,先去掉
gui.py是pyqt寫的程序,是打包的主體,這里引用了adb.ui ,config.py,main.py文件
adb.ui 是qt設(shè)計師設(shè)計的界面
config.py是一些配置項目,比如配置抓取日志時的儲存路徑和車機(jī)里面存日志的路徑
i.ico是圖標(biāo)圖片
main.py是一些腳本方法,比如抓日志,啟動app,清除緩存等
output.txt是一個普通文本
生成spec文件(目錄切到當(dāng)前項目下控制臺操作)
pyi-makespec -F -w gui.py
參數(shù)解釋
F 或 --onefile:生成一個單個的可執(zhí)行文件。將所有依賴項打包到一個獨立的可執(zhí)行文件中。
-D 或 --onedir:生成一個包含所有依賴項的目錄??蓤?zhí)行文件和依賴文件存儲在同一個目錄下。
-n NAME 或 --name NAME:指定生成的可執(zhí)行文件的名稱,替換默認(rèn)的輸出文件名。
-w 或 --windowed:生成一個無控制臺窗口的可執(zhí)行文件,即在后臺運行時不顯示控制臺窗口。
-c 或 --console:生成一個帶有控制臺窗口的可執(zhí)行文件,即在后臺運行時顯示控制臺窗口。
配置spec文件,配置ui界面和ico圖標(biāo)
pyi-makespec -F -c gui.py
-c 的好處可以實時顯示控制臺內(nèi)容文章來源:http://www.zghlxwxcb.cn/news/detail-792355.html
block_cipher = None
a = Analysis(
['gui.py'],
pathex=[],
binaries=[],
datas=[('adb.ui','.')], #ui文件,使用qt設(shè)計師畫的頁面
hiddenimports=[],
hookspath=[],
hooksconfig={},
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='gui',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['i.ico'], #軟件圖標(biāo)路徑
)
重點
gui.py文件讀取ui時加入一些東西
processPath方法和使用此方法讀取adb.ui文件( self.ui = QUiLoader().load(processPath(‘a(chǎn)db.ui’))
)這樣才能讀取到ui文件文章來源地址http://www.zghlxwxcb.cn/news/detail-792355.html
import sys,os
from PySide2.QtWidgets import QApplication, QMessageBox
from PySide2.QtUiTools import QUiLoader
from main import PackNameOperate, Log
def processPath(path):
'''
:param path: 相對于根目錄的路徑
:return: 拼接好的路徑
'''
if getattr(sys, 'frozen', False): # 判斷是否存在屬性frozen,以此判斷是打包的程序還是源代碼。false為默認(rèn)值,即沒有frozen屬性時返回false
base_path = sys._MEIPASS #該屬性也是打包程序才會有,源代碼嘗試獲取該屬性會報錯
else:
base_path = os.path.abspath(".") # 當(dāng)源代碼運行時使用該路徑
return os.path.join(base_path, path)
class Stats:
def __init__(self):
self.kill_list = ['獲取當(dāng)前運行的包名', '殺掉當(dāng)前啟動的app',
'清除當(dāng)前app緩存信息', '清楚緩存并且殺掉app', '清楚緩存并且殺掉app并且重新啟動']
self.ui = QUiLoader().load(processPath('adb.ui'))
self.ui.qd_app.clicked.connect(self.qd)
self.ui.zx.clicked.connect(self.kill)
self.ui.kill_apps.addItems(self.kill_list)
self.ui.get_log.clicked.connect(self.log)
def qd(self):
pack_name = self.ui.pack_name.text()
if PackNameOperate.pack_name_start(pack_name) == 1:
QMessageBox.critical(self.ui, '包名錯誤', '請檢查包名是否輸入正確!')
else:
QMessageBox.information(self.ui, '操作成功', f'{pack_name}啟動完成')
def kill(self):
xz = self.ui.kill_apps.currentText()
index = self.kill_list.index(xz)
if PackNameOperate.kill_app(index) == 0:
QMessageBox.information(self.ui, '操作成功', f'"{xz}"執(zhí)行完成')
elif '包名' in PackNameOperate.kill_app(index):
QMessageBox.information(self.ui, '操作成功', PackNameOperate.kill_app(index))
else:
QMessageBox.critical(self.ui, '錯誤', '設(shè)備未連接或者未啟動adb模式')
def log(self):
Log.log()
app = QApplication([])
stats = Stats()
stats.ui.show()
app.exec_()
此時就可以打包了,對spec文件打包(目錄切到當(dāng)前項目下控制臺操作)
pyinstaller gui.spec
到了這里,關(guān)于Pyinstaller打包多個py文件和qt設(shè)計師的ui文件,帶ico圖標(biāo)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!