軟件環境: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程序打包時遇到的一些問題
-
- 在idle里運行正常,但是打包出來的程序運行就直接停止工作
這個問題僅在win764位下打包出現的(在32位系統中運行打包后的程序會提示缺少Qt5Core.dll和Qt5Gui.dll),由於代碼中並未用到QtCore和QtGui模塊,於是在導入時並未導入。解決辦法:直接將兩個模塊導入,打包成功。
- 在idle里運行正常,但是打包出來的程序運行就直接停止工作
綜上可以下,對於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下載網址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
搜索py2exe,在你搜索到的位置看到這樣的條目,下載和你的python版本和系統位數相對應的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)