上回在《使用 PyInstaller 打包 Python 程序》中,我們介紹了使用 PyInstaller 對 Python 程序進(jìn)行打包,今天帶大家認(rèn)識一個新的工具:py2exe。
接下來將從這幾個方面進(jìn)行介紹:基本使用方法、高級參數(shù)、注意點(diǎn)等。
py2exe 是一個將 python 腳本轉(zhuǎn)換成 Windows 上的可獨(dú)立執(zhí)行的可執(zhí)行程序(*.exe)的工具,這樣,你就可以不用裝 python 而在 Windows 系統(tǒng)上運(yùn)行這個可執(zhí)行程序。
安裝
pip install py2exe# 或者python -m pip install py2exe
1
2
3
1
2
3
看一個簡單的例子:先寫一個簡單的腳本,文件名: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)123456789123456789123456789123456789
下面還需要個用于發(fā)布程序的設(shè)置腳本:mysetup.py,在其中的 setup 函數(shù)前插入語句 import py2exe
。
from distutils.core import setupimport py2exe
setup(console=['helloworld.py'])
1
2
3
4
1
2
3
4
1
2
3
4
1
2
3
4
然后按下面的方法運(yùn)行 mysetup.py:
python mysetup.py py2exe11
運(yùn)行生成的文件:
需要注意,這里需要在 Windows 環(huán)境下運(yùn)行!否則可能會出現(xiàn)以下異常:
上面的命令執(zhí)行后將產(chǎn)生一個名為 dist 的子目錄,其中包含了 helloworld.exe、python24.dll、library.zip 等等文件:
dist 子目錄中的文件包含了程序所必須的東西,你需要將該目錄中的所有內(nèi)容一起發(fā)布。
默認(rèn)情況下,py2exe 會在 dist 下創(chuàng)建以下這些文件:
1、一個或多個 exe 文件;
2、幾個 .pyd 文件,它們是已編譯的擴(kuò)展名,是 exe 文件所需要的;
3、python**.dll,加上其它的 .dll 文件,這些 .dll 是 .pyd 所需要的;
4、一個 library.zip 文件,它包含了已編譯的純的 python 模塊如 .pyc 或 .pyo;
我們可以看到生成的 dist 目錄中文件很多,那么是不是可以進(jìn)行優(yōu)化呢?
# mysetup.py# from distutils.core import setup# import py2exe# setup(console=['helloworld.py'])# -*- encoding:utf-8 -*-from distutils.core import setupimport 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'}])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
options 可以用來指定一些編譯的參數(shù),譬如是否壓縮,是否打包為一個文件等。
再次運(yùn)行后,發(fā)現(xiàn)所有內(nèi)容打包進(jìn)了一個 helloworld.exe 程序中。
一些應(yīng)用程序在運(yùn)行時需要額外的文件,諸如配置文件、字體、圖標(biāo)。py2exe 并不會自動把他們打包到 dist 目錄,不過可以通過配置參數(shù)來打包。
可以在安裝腳本中用 data_files
可選項(xiàng)指定了那些額外的文件,那么 py2exe 能將這些文件拷貝到 dist 子目錄中。
格式如下:data_files=[(“目的文件夾”,[“文件名”,]), (“目的文件夾”,[“文件名”,]), (“目的文件夾”,[“文件名”,]),]。
比如,我們的程序中有一個名為 images 的目錄放置了程序需要的圖片,
那么我們就需要在 setup 函數(shù)中配置參數(shù) data_files,這個參數(shù)包含一個元組列表 (target_dir,files)
,其中 target_dir 是指定文件存放的目標(biāo)路徑,files 是這些額外文件的一個列表。
示例如下:
from distutils.core import setupimport py2exe setup( windows = ['hello.py], data_files = [('images',['images\*.jpg'])] )12345678123456781234567812345678
上面的示例中,會把 images 目錄中所有的 jpg 文件打包到 dist/images 子目錄中。
1、py2exe 新版本只支持 python3.3 以上,可以使用 pip install py2exe_py2 來安裝兼容 python2 版本;
2、若在 python3.6 版本下運(yùn)行報(bào)錯,請切換到 python3.4 嘗試;
3、python3 如果是 64 位,生成的 exe 只能在 64 位操作系統(tǒng)下運(yùn)行,使用 32 位 python 可以解決;
4、從 Python 3.3,Windows 在構(gòu)建 Python 時使用的是 Visual Studio 2010,因此生成后,需要手動將 msvcr100.dll 拷到生成目錄下(dist目錄),否則最終的文件運(yùn)行時可能會報(bào)錯;
或者通過 data_files=[('',['MSVCR100.dll'])],
打包其中;
比如,我在 Win10 下打的包,拷貝到 Win7 上,運(yùn)行出錯:
出現(xiàn)類似確實(shí) dll 文件的情況,都可以參考這種方法進(jìn)行解決;
對于 pyinstaller 和 py2exe 兩種把 Python 文件打包成 exe 的可執(zhí)行文件的方法,都有各自的優(yōu)缺點(diǎn)。但是最終目的都是為了在沒有 Python 環(huán)境下的普通 Windows 系統(tǒng)的電腦中可直接運(yùn)行,這點(diǎn)還是很不錯的。
大家根據(jù)自己的需要,擇優(yōu)選擇就行了。
參考:
1、http://irootlee.com/Py2exe/
2、https://www.jianshu.com/p/afc56b647866