[英]How to tidy up a packaged Python app with pyinstaller?
所以,假設我有一個簡單的pyqt應用程序main.py
:
import sys
from PyQt5 import QtWidgets
def main():
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
然后我得到一個main.spec
,它將應用程序打包在一個文件夾中:
# -*- mode: python -*-
block_cipher = None
import inspect, os
current_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
a = Analysis(['main.py'],
pathex=[current_path],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=False,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
name='main')
做pyinstaller main.spec
的結果將是一個有效的pyqt應用程序,它有一堆文件:
所以,這是事情,我不喜歡當前的結果,我也不喜歡使用--onefile的選項(將文件提取到臨時目錄的想法不是我的一杯茶)。
現在,我發現這篇有趣的文章提出了解決這個問題的方法,我試圖用這個簡單的mcve重現它,但由於某種原因,我已經陷入某種困境。 這是我遵循的步驟:
1)我創建了一個文件pyinstaller\\use_lib.py
:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "lib"))
2)我在上面的main.spec
文件中用runtime_hooks=['.\\\\pyinstaller\\\\use_lib.py']
替換了runtime_hooks=[]
3)我重新運行了pyinstaller main.spec
,它生成了一堆凌亂的文件,如上面的截圖
4)我已將所有依賴項文件手動移動到lib目錄,結果如下:
問題:當我嘗試運行應用程序時會崩潰:
為什么你認為它崩潰了? 我搞砸了哪一步? 你能解釋一下如何解決它嗎?
你不能將那些dll從exe移動到另一個目錄中。 這些dll是靜態鏈接的,應該放在與exe相同的目錄中。
無論如何。 查看C:\\Program Files
一些應用程序文件夾。 每個目錄中都有大量文件。 這就是它的方式。 沒有人關心,因為用戶不會查看這些文件夾。
如果您想分發您的應用程序,您應該像所有其他開發人員一樣。 使用PyInstaller后的文件夾狀態不是應用程序的最終形式,而只是初始形式:任何C / C ++應用程序都將從這種形式開始向用戶開始。
因此,如果要將應用程序分發給用戶,則應使用其中一個安裝程序工具。 Windows平台的最佳安裝包形式是msi
包(為“Windows Installer”制作)。 要構建您的msi
數據包,您可以使用WiX Installer
(創建msi
數據包的最簡單方法)或MS Visual Studio
。 還有大量的安裝工具會生成exe
形式的安裝包(通常它們比使用msi-tools更簡單): NSIS
, Inno Setup
, InstallShield
(付費!)等。你也可以搜索通過https://pypi.python.org/pypi數據庫安裝此安裝程序的名稱:您可以使用一些特殊的Python數據包來管理其中一些安裝工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.