使用py2exe打包你的py程序


軟件環境:python3.3.4 + PyQt5

使用py2exe打包寫好的py文件,過程如下:

在你要打包的代碼文件(比如sample.py)的同文件夾建立一個python代碼文件(比如setup.py),然后在其中輸入:

from distutils.core import setup
import py2exe
import sys

#this allows to run it with a simple double click.
sys.argv.append('py2exe')

py2exe_options = {
        "includes": ["sip"],  # 如果打包文件中有PyQt代碼,則這句為必須添加的
        "dll_excludes": ["MSVCP90.dll",],  # 這句必須有,不然打包后的程序運行時會報找不到MSVCP90.dll,如果打包過程中找不到這個文件,請安裝相應的庫
        "compressed": 1,
        "optimize": 2,
        "ascii": 0,
        "bundle_files": 1,  # 關於這個參數請看第三部分中的問題(2)
        }

setup(
      name = 'PyQt Demo',
      version = '1.0',
      windows = ['sample.py',],   # 括號中更改為你要打包的代碼文件名
      zipfile = None,
      options = {'py2exe': py2exe_options}
      )

一些可能出現的問題:

  • error: MSVCP90.dll: No such file or directory
    解決方法:按如上程序,將該dll寫入dll_excludes中。
    其他電腦如果無法運行,可能是由於該電腦中沒有安裝Microsoft Visual C++2008 Redistributable - x86造成的,請到微軟官網上下載安裝該程序,或將MSVCP90.dll放入dist文件夾(注意:方法未驗證)。

  • error: bundle-files 1 not yet supported on win64
    對於64位的Py2exe而言,bundle_files選項目前仍不可用,無法生成為單文件。
    有同學提意見說這個選項在64位中只能是3,如果出現這個錯誤的同學可以嘗試,但是本人親測win7 64位,python3.3.2打包成功,並在別人的電腦上運行過,根據我的系統位數和python版本,我在上面提到的網址下載的py2exe程序是這個
    py2exe-0.9.2.2-cp33-none-win_amd64.whl

  • 圖標等不顯示
    網上的一種說法是這是Py2exe打包時沒有將其打包進來造成的,可以將“Python\Lib\site-packages\PyQt4\plugins\imageformats”文件夾復制到dist目錄下,再執行打包腳本。不過我在實驗的過程中並沒有發現這個問題。
    當然,一定要注意,把你圖標按照程序中寫的位置放入到dist目錄下。否則,當然不會顯示。
    PS:這里說一下,如果你的程序里面用到了絕對路徑類似於 "C:\users\user_name\1.txt" 這樣的,在別人的電腦上運行時必須把這個1.txt放到別人電腦的 "C:\users\user_name" 目錄下,這樣會非常麻煩,解決辦法是在程序的最前方加上這樣的語句

import sys, os
sys.path.append(os.getcwd())  # 把當前路徑(即程序所在路徑)暫時加入系統的path變量中

在程序運行期間,系統會把程序所在路徑也作為搜索路徑,這樣可以直接用相對路徑就可以了,比如"\user_name\1.txt"就是指你的程序所在路徑下的user_name文件夾中的1.txt文件

  • 用命令行執行程序
    將setup函數中的windows改為console。

  • 關於PyQt5程序打包時遇到的一些問題

    • This application failed to start because it could not find or load the Qt platform plugin "windows"
      根據這個貼子鏈接,將PyQt5目錄下的platforms文件夾拷入,在自己的電腦上正常運行;然后將程序(包括新加的platforms文件夾)拷到別人電腦上運行,依然錯誤根據這個貼子鏈接,將PyQt5目錄下的libEGL.dll文件拷入程序所在目錄,運行正常,另外,這個貼子還提到,只保留platforms目錄下的qwindows.dll,程序可以運行
    • 在idle里運行正常,但是打包出來的程序運行就直接停止工作
      這個問題僅在win764位下打包出現的(在32位系統中運行打包后的程序會提示缺少Qt5Core.dll和Qt5Gui.dll),由於代碼中並未用到QtCore和QtGui模塊,於是在導入時並未導入。解決辦法:直接將兩個模塊導入,打包成功。

綜上可以下,對於PyQt5程序打包時,需要注意以下兩點:
需要在setup.py文件中的windows = ['sample.py',], 這一句后面加上

data_files=[("",
                   [r"C:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),
                  ("platforms",
                   [r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],

setup()函數的data_files參數是一個列表,列表中包含1個或多個元組。元組的第一個元素是一個字符串,表示你准備復制過來的文件所放的文件夾,相對於你的程序所在位置的相對路徑(""表示和你的程序在同一目錄);元組的第二個元素是一個列表,列表中的元素是你所要放在這個文件夾中的文件的路徑(注意,這個路徑是指你所要復制的文件所在的位置,需要絕對路徑)。所以上面的語句是將qwindows.dll拷貝到程序所在目錄下的platforms文件夾中,而將libEGL.dll放在程序所在的文件夾中。

即使你只用到QtWidgets模塊,也要同時導入QtCore和QtGui,也就是在代碼前面必須加上

import QtWidgets, QtCore, QtGui

py2exe的安裝步驟:

py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl

0.9.2.2:py2exe版本號;
cp34:python版本號;
win_amd64:系統位數
  • 安裝方法:下載好后在命令行下輸入 pip install
    下載文件絕對路比如你下載在C盤根目錄,則輸入

    pip install c:\py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl

以上內容摘自魚C論壇:Python3代碼打包教程(用py2exe把你的代碼變成exe)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM