2016-12-04 168 views
1

所以,讓我們說我有一個簡單的PyQt的應用main.py如何用pyinstaller清理打包的Python應用程序?

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應用程序,其中有一堆文件:

enter image description here

所以,這裏的東西,我不喜歡目前的結果,我也不喜歡使用--onefile(提取文件到臨時目錄的想法不是我的一杯茶)的選項。

現在,我發現了這個有趣的article,它提出了一個解決這個問題的方法,我試圖用這個簡單的mcve在這裏重現它,但由於某些原因,我在某個點上卡住了。下面是我遵循的步驟:

1)I已經創建了一個文件pyinstaller\use_lib.py:在上述main.spec文件

3)I

import sys 
import os 
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "lib")) 

2)我已經更換runtime_hooks=[]通過runtime_hooks=['.\\pyinstaller\\use_lib.py']重新運行pyinstaller main.spec,這已經產生了一堆亂七八糟的文件,如上面的截圖

4)我已經手動將所有依賴文件移動到lib目錄,結果是這樣的:

enter image description here

問題:當我嘗試運行應用程序將崩潰:

enter image description here

爲什麼你認爲它的崩潰?在哪一步我搞砸了?你能解釋我如何解決它嗎?

回答

0

你不能將這些dll從exe文件移動到另一個目錄中。這些dll是靜態鏈接的,應該放在與exe相同的目錄下。

無論如何。看看你的C:\Program Files裏的一些應用程序文件夾。每個目錄中都有大量的文件。這只是它的方式。沒有人關心,因爲用戶不會查看這些文件夾。

如果你想分發你的應用程序,你應該像所有其他開發者一樣。使用PyInstaller之後的文件夾狀態不是應用程序的最終形式,而只是一種初始形式:任何C/C++應用程序都將從這種確切形式開始向用戶展示。

所以如果你想分發你的應用程序給用戶,你應該使用其中一個安裝工具。 Windows平臺的最佳安裝包形式爲msi數據包(用於「Windows安裝程序」)。要構建您的msi數據包,您可以使用WiX Installer(創建msi數據包的最簡單方法)或MS Visual Studio。此外還有大量的安裝工具,它們將生成安裝包的形式(通常它們比msi工具更易於使用):NSIS,Inno Setup,InstallShield(付費!)等。您也可以搜索名稱通過https://pypi.python.org/pypi數據庫安裝這些安裝程序:有一些特殊的Python數據包可用於管理某些安裝工具。