1、下載并安裝py2exe,可下載最新版本。
創(chuàng)新互聯(lián)建站主要為客戶提供服務(wù)項目涵蓋了網(wǎng)頁視覺設(shè)計、VI標(biāo)志設(shè)計、全網(wǎng)營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、微商城、網(wǎng)站托管及網(wǎng)站維護(hù)公司、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計、SEO優(yōu)化排名。設(shè)計、前端、后端三個建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為成都發(fā)電機(jī)回收行業(yè)客戶提供了網(wǎng)站開發(fā)服務(wù)。
2、編寫安裝腳本,比較簡單,不過多解釋,如下:
Screenshot_setup.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from distutils.core import setup
import py2exe
includes = ["encodings", "encodings.*"]
data_files = ['CameraDll.dll']
options = {"py2exe":
{ "compressed": 1,
"optimize": 2,
"bundle_files": 1,
"includes": includes
}
}
setup(
version = "1.0",
description = "Screenshot Tool",
name = "Screenshot Tool",
options = options,
zipfile=None,
data_files = data_files,
console=[{"script": "Screenshot.py", "icon_resources": [(1, "Screenshot.ico")] }]
)
各參數(shù)含義見第5小節(jié)或執(zhí)行python命令行下執(zhí)行help(py2exe)查看。
3、打包程序:
a、將要找包的程序、文件和打包腳本放在同一目錄下,如下:
E:\tmp\pyexe_tmptree /F
文件夾 PATH 列表
卷序列號碼為 0007F240 101F:F68D
E:.
CameraDll.dll
screenshot.ico
Screenshot.py
screenshot_setup.py
沒有子文件夾
E:\tmp\pyexe_tmp
b、執(zhí)行打包腳本:
E:\tmp\pyexe_tmppython screenshot_setup.py py2exe
python screenshot_setup.py py2exe
running py2exe
creating E:\tmp\pyexe_tmp\build
creating E:\tmp\pyexe_tmp\build\bdist.win32
creating E:\tmp\pyexe_tmp\build\bdist.win32\winexe
creating E:\tmp\pyexe_tmp\build\bdist.win32\winexe\collect-2.6
creating E:\tmp\pyexe_tmp\build\bdist.win32\winexe\bundle-2.6
creating E:\tmp\pyexe_tmp\build\bdist.win32\winexe\temp
creating E:\tmp\pyexe_tmp\dist
*** searching for required modules ***
*** parsing results ***
*** finding dlls needed ***
*** create binaries ***
*** byte compile python files ***
writing byte-compilation script 'e:\tmp\tmp1ecbcw.py'
使用py2exe
安裝py2exe
進(jìn)入python程序所在文件夾
在文件夾下寫一個setup.py的python文件,內(nèi)容如下
from distutils.core import setup
import py2exe
setup(console=["將要轉(zhuǎn)換的文件名稱.py"])
打開CMD窗口,將工作目錄切換到python文件所在文件夾,并輸入命令“python setup.py py2exe"
命令成功完成后,進(jìn)入原python文件的文件夾下可看到新產(chǎn)生了文件夾
進(jìn)入dist文件夾,里面的exe就是我們需要的windows程序。
return 應(yīng)該放在一個函數(shù)里面的,
將python打包成exe的程序有很多,比如py2exe、PyInstaller等等,但是到目前為止,它們對python3.1支持的都不好,所以這里我要介紹一下cx_freeze 4.2.2,它還能支持跨平臺,可以在windows和linux運行。
cx_freeze的下載網(wǎng)址為 ,要根據(jù)已安裝的python版本進(jìn)行選擇。比如我使用的是python3.1,所以就要下載cx_Freeze-4.2.2.win32-py3.1.msi這個文件。運行這個安裝包后,相關(guān)程序就會被拷貝到python的目錄下。主要在兩個地方,一個是C:/Python31/Scripts,另一個是C:/Python31/Lib/site-packages/cx_Freeze
在以前版本的cx_Freeze中,是通過FreezePython.py這個腳本將py轉(zhuǎn)換為exe,而在4.2.2這個版本中,F(xiàn)reezePython.py已經(jīng)不見了,主要的工作交給了C:/Python31/Scripts下的cxfreeze.bat來完成。
使用cx_Freeze完成python打包exe主要有兩種方法:
第一種,直接運行cxfreeze.bat通過:
先進(jìn)入cmd命令行,進(jìn)入C:/Python31/Scripts目錄,然后運行cxfreeze.bat -h 就可以看到它的使用說明了。我們可以用cx_freeze自己的sample做個試驗。
進(jìn)入到c:/python31/scripts/下,運行
cxfreeze C:/Python31/Lib/site-packages/cx_Freeze/samples/PyQt4/PyQt4app.py --install-dir=d:/123
pytqt4app.py就會被打包成exe,并且它所用到的庫文件,也被一并考到了d:/123目錄下。
可以使用PyInstaller把python程序打包成exe,安裝使用pip install pyinstaller,使用時,使用pyinstaller打包,參數(shù)如下
-F, –onefile 打包一個單個文件,如果你的代碼都寫在一個.py文件的話,可以用這個,如果是多個.py文件就別用
-D, –onedir 打包多個文件,在dist中生成很多依賴文件,適合以框架形式編寫工具代碼,我個人比較推薦這樣,代碼易于維護(hù)
-K, –tk 在部署時包含 TCL/TK
-a, –ascii 不包含編碼.在支持Unicode的python版本上默認(rèn)包含所有的編碼.
-d, –debug 產(chǎn)生debug版本的可執(zhí)行文件
-w,–windowed,–noconsole 使用Windows子系統(tǒng)執(zhí)行.當(dāng)程序啟動的時候不會打開命令行(只對Windows有效)
-c,–nowindowed,–console
使用控制臺子系統(tǒng)執(zhí)行(默認(rèn))(只對Windows有效)
pyinstaller -c xxxx.py
pyinstaller xxxx.py --console
-s,–strip 可執(zhí)行文件和共享庫將run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用.
-X, –upx 如果有UPX安裝(執(zhí)行Configure.py時檢測),會壓縮執(zhí)行文件(Windows系統(tǒng)中的DLL也會)(參見note)
-o DIR, –out=DIR 指定spec文件的生成目錄,如果沒有指定,而且當(dāng)前目錄是PyInstaller的根目錄,會自動創(chuàng)建一個用于輸出(spec和生成的可執(zhí)行文件)的目錄.如果沒有指定,而當(dāng)前目錄不是PyInstaller的根目錄,則會輸出到當(dāng)前的目錄下.
-p DIR, –path=DIR 設(shè)置導(dǎo)入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號,Linux使用冒號)分割,指定多個目錄.也可以使用多個-p參數(shù)來設(shè)置多個導(dǎo)入路徑,讓pyinstaller自己去找程序需要的資源
–icon=FILE.ICO
將file.ico添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效),改變程序的圖標(biāo) pyinstaller -i ico路徑 xxxxx.py
–icon=FILE.EXE,N 將file.exe的第n個圖標(biāo)添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效)
-v FILE, –version=FILE 將verfile作為可執(zhí)行文件的版本資源(只對Windows系統(tǒng)有效)
-n NAME, –name=NAME 可選的項目(產(chǎn)生的spec的)名字.如果省略,第一個腳本的主文件名將作為spec的名字
zip() ?功能是從參數(shù)的多個迭代器中選取元素組合成一個新的迭代器。顧名思義,它就是一個將對象進(jìn)行打包和解包的函數(shù)。
它可以傳入的參數(shù)包括;元組、列表、字典等迭代器
它返回一個zip對象,其內(nèi)部元素為元組,一組一組的,可以轉(zhuǎn)化為列表或元組,這里要強(qiáng)調(diào)一下,Python2和Python3中返回的zip對象有所不同。
Python3中zip()函數(shù)再不再返回list對象,但是可以通過list強(qiáng)行轉(zhuǎn)換。(類似的函數(shù)變化還有dictionary關(guān)聯(lián)的keys()、values()、items(),map(),filter())。
打包zip(iterables)
上面的代碼使用的環(huán)境是Python3.6,其中l(wèi)ist (z)操作就是強(qiáng)制轉(zhuǎn)換。注意一個問題,a和b這兩個列表是不同長短的,這時候zip函數(shù)就會匹配完最短的那個便結(jié)束。
當(dāng)zip函數(shù)的參數(shù)只有一個時,它將從iterable中依次取一個元素,組成一個元組。
解包zip(*iterables)
解包,zip 相反,可理解為解壓,返回多維矩陣形式,有幾個組元素就返回幾維的。
比如,下面我是用三個列表組合起來的迭代式,那么解壓后就返回三維的矩陣
zip高級用法
講完了基本的再來說一下該函數(shù)的高級用法。高級用法離不開一個詞:Pythonic,就是將代碼寫的更優(yōu)雅美觀,看起來有逼格!
1. 列表推導(dǎo)
例如:
a = [1,2,3,4]
b = [5,6,7,8]
我們要同時遍歷a、b,且要對它們進(jìn)行操作,那就要放在同一個for循環(huán)內(nèi),zip函數(shù)正好合適
注意:如果是Python2環(huán)境中,要使用izip才能提高效率。
當(dāng)然,如果你需要對下標(biāo)進(jìn)行操作,那么還需要加上enumerate函數(shù)
2. 使用zip創(chuàng)建鍵值對,zip方法返回的是一個元組,用它來創(chuàng)建鍵值對,簡單明了。
定義:zip([iterable,
...])
zip()是Python的一個內(nèi)建函數(shù),它接受一系列可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個tuple(元組),然后返回由這些
tuples組成的list(列表)。若傳入?yún)?shù)的長度不等,則返回list的長度和參數(shù)中長度最短的對象相同。利用*號操作符,可以將list
unzip(解壓),看下面的例子就明白了:
1
2
3
4
5
6
7
8
9
a
=
[1,2,3]
b
=
[4,5,6]
c
=
[4,5,6,7,8]
zipped
=
zip(a,b)
[(1,
4),
(2,
5),
(3,
6)]
zip(a,c)
[(1,
4),
(2,
5),
(3,
6)]
zip(*zipped)
[(1,
2,
3),
(4,
5,
6)]
對于這個并不是很常用函數(shù),下面舉幾個例子說明它的用法:
*
二維矩陣變換(矩陣的行列互換)
比如我們有一個由列表描述的二維矩陣
a
=
[[1,
2,
3],
[4,
5,
6],
[7,
8,
9]]
通過python列表推導(dǎo)的方法,我們也能輕易完成這個任務(wù)
1
2
[
[row[col]
for
row
in
a]
for
col
in
range(len(a[0]))]
[[1,
4,
7],
[2,
5,
8],
[3,
6,
9]]
另外一種讓人困惑的方法就是利用zip函數(shù):
1
2
3
4
5
a
=
[[1,
2,
3],
[4,
5,
6],
[7,
8,
9]]
zip(*a)
[(1,
4,
7),
(2,
5,
8),
(3,
6,
9)]
map(list,zip(*a))
[[1,
4,
7],
[2,
5,
8],
[3,
6,
9]]
這種方法速度更快但也更難以理解,將list看成tuple解壓,恰好得到我們“行列互換”的效果,再通過對每個元素應(yīng)用list()函數(shù),將tuple轉(zhuǎn)換為list
*
以指定概率獲取元素
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
import
random
def
random_pick(seq,probabilities):
x
=
random.uniform(0,
1)
cumulative_probability
=
0.0
for
item,
item_probability
in
zip(seq,
probabilities):
cumulative_probability
+=
item_probability
if
x
cumulative_probability:
break
return
item
for
i
in
range(15):
random_pick("abc",[0.1,0.3,0.6])
'c'
'b'
'c'
'c'
'a'
'b'
'c'
'c'
'c'
'a'
'b'
'b'
'c'
'a'
'c'
這個函數(shù)有個限制,指定概率的列表必須和元素一一對應(yīng),而且和為1,否則這個函數(shù)可能不能像預(yù)想的那樣工作。
稍微解釋下,先利用random.uniform()函數(shù)生成一個0-1之間的隨機(jī)數(shù)并復(fù)制給x,利用zip()函數(shù)將元素和他對應(yīng)的概率打包成tuple,然后將每個元素的概率進(jìn)行疊加,直到和大于x終止循環(huán)
這樣,”a”被選中的概率就是x取值位于0-0.1的概率,同理”b”為0.1-0.4,”c”為0.4-1.0,假設(shè)x是在0-1之間平均取值的,顯然我們的目的已經(jīng)達(dá)到