1. 程式人生 > >使用 py2exe 打包 Python 程式

使用 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 環境下執行!否則可能會出現以下異常:

'WinDLL' is not defined

上面的命令執行後將產生一個名為 dist 的子目錄,其中包含了 helloworld.exe、python24.dll、library.zip 等等檔案:

dist目錄

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」即可獲取下載地址。