簡體   English   中英

如何使用pyinstaller整理打包的Python應用程序?

[英]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更簡單): NSISInno SetupInstallShield (付費!)等。你也可以搜索通過https://pypi.python.org/pypi數據庫安裝此安裝程序的名稱:您可以使用一些特殊的Python數據包來管理其中一些安裝工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM