使用 py2exe 打包 Python 程式
上回在《使用 PyInstaller 打包 Python 程式》中,我們介紹了使用 PyInstaller 對 Python 程式進行打包,今天帶大家認識一個新的工具:py2exe。
接下來將從這幾個方面進行介紹:基本使用方法、高階引數、注意點等。
簡介 & 安裝
py2exe 是一個將 python 指令碼轉換成 Windows 上的可獨立執行的可執行程式(*.exe)的工具,這樣,你就可以不用裝 python 而在 Windows 系統上執行這個可執行程式。
- 安裝
pip install py2exe
# 或者
python -m pip install py2exe
基本用法
看一個簡單的例子:先寫一個簡單的指令碼,檔名:helloworld.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def say_hello(name):
print("Hello, " + name)
if __name__ == "__main__":
name = input("What's your name:")
say_hello(name)
下面還需要個用於釋出程式的設定指令碼:mysetup.py,在其中的 setup 函式前插入語句 import py2exe
from distutils.core import setup
import py2exe
setup(console=["helloworld.py"])
然後按下面的方法執行 mysetup.py:
python mysetup.py py2exe
執行生成的檔案:
需要注意,這裡需要在 Windows 環境下執行!否則可能會出現以下異常:
上面的命令執行後將產生一個名為 dist 的子目錄,其中包含了 helloworld.exe、python24.dll、library.zip 等等檔案:
dist 子目錄中的檔案包含了程式所必須的東西,你需要將該目錄中的所有內容一起釋出。
預設情況下,py2exe 會在 dist 下建立以下這些檔案:
1、一個或多個 exe 檔案;
2、幾個 .pyd 檔案,它們是已編譯的副檔名,是 exe 檔案所需要的;
3、python**.dll,加上其它的 .dll 檔案,這些 .dll 是 .pyd 所需要的;
4、一個 library.zip 檔案,它包含了已編譯的純的 python 模組如 .pyc 或 .pyo;
擴充套件
setup 優化
我們可以看到生成的 dist 目錄中檔案很多,那麼是不是可以進行優化呢?
# mysetup.py
# from distutils.core import setup
# import py2exe
# setup(console=["helloworld.py"])
# -*- encoding:utf-8 -*-
from distutils.core import setup
import py2exe
INCLUDES = []
options = {
"py2exe" :
{
"compressed" : 1, # 壓縮
"optimize" : 2,
"bundle_files" : 1, # 所有檔案打包成一個 exe 檔案
"includes" : INCLUDES,
"dll_excludes" : ["MSVCR100.dll"]
}
}
setup(
options=options,
description = "this is a py2exe test",
zipfile=None,
console = [{"script":'helloworld.py'}])
options 可以用來指定一些編譯的引數,譬如是否壓縮,是否打包為一個檔案等。
再次執行後,發現所有內容打包進了一個 helloworld.exe 程式中。
指定額外的檔案
一些應用程式在執行時需要額外的檔案,諸如配置檔案、字型、圖示。py2exe 並不會自動把他們打包到 dist 目錄,不過可以通過配置引數來打包。
可以在安裝指令碼中用 data_files
可選項指定了那些額外的檔案,那麼 py2exe 能將這些檔案拷貝到 dist 子目錄中。
格式如下:data_files=[(“目的資料夾”,[“檔名”,]), (“目的資料夾”,[“檔名”,]), (“目的資料夾”,[“檔名”,]),]。
比如,我們的程式中有一個名為 images 的目錄放置了程式需要的圖片,
那麼我們就需要在 setup 函式中配置引數 data_files,這個引數包含一個元組列表 (target_dir,files)
,其中 target_dir 是指定檔案存放的目標路徑,files 是這些額外檔案的一個列表。
示例如下:
from distutils.core import setup
import py2exe
setup(
windows = ['hello.py],
data_files = [('images',['images\*.jpg'])]
)
上面的示例中,會把 images 目錄中所有的 jpg 檔案打包到 dist/images 子目錄中。
注意點
1、py2exe 新版本只支援 python3.3 以上,可以使用 pip install py2exe_py2 來安裝相容 python2 版本;
2、若在 python3.6 版本下執行報錯,請切換到 python3.4 嘗試;
3、python3 如果是 64 位,生成的 exe 只能在 64 位作業系統下執行,使用 32 位 python 可以解決;
4、從 Python 3.3,Windows 在構建 Python 時使用的是 Visual Studio 2010,因此生成後,需要手動將 msvcr100.dll 拷到生成目錄下(dist目錄),否則最終的檔案執行時可能會報錯;
或者通過 data_files=[("",["MSVCR100.dll"])],
打包其中;
比如,我在 Win10 下打的包,拷貝到 Win7 上,執行出錯:
出現類似確實 dll 檔案的情況,都可以參考這種方法進行解決;
總結
對於 pyinstaller 和 py2exe 兩種把 Python 檔案打包成 exe 的可執行檔案的方法,都有各自的優缺點。但是最終目的都是為了在沒有 Python 環境下的普通 Windows 系統的電腦中可直接執行,這點還是很不錯的。
大家根據自己的需要,擇優選擇就行了。
參考:
1、http://irootlee.com/Py2exe/
2、https://www.jianshu.com/p/afc56b647866
如果覺得有用,歡迎關注我的微信,一起學習,共同進步,不定期推出贈書活動~
最近蒐集到傳智播客 2018 最新 Python 和 Java 教程!關注本公眾號,後臺回覆「2018」即可獲取下載地址。