py2exe打包python成.exe文件
打包過程和結(jié)果
1螟加、創(chuàng)建setup腳本打包文件,其中設(shè)置打包的屬性和方法。注意:盡量將被打包文件和此打包腳本放在同目錄下(因?yàn)樵趪L試非同目錄下時(shí),出現(xiàn)了非可再現(xiàn)性的尋找被打包文件失敗)
2闻妓、在cmd命令行,進(jìn)入setup打包腳本所在命令行掠械,執(zhí)行此腳本文件(python setup.py py2exe)
3、默認(rèn)出現(xiàn)built和dist兩個(gè)文件注祖。dist文件中的內(nèi)容即為打包程序的內(nèi)容猾蒂,也即可發(fā)布的內(nèi)容。
打包過程遇到的問題:
1是晨、Win10系統(tǒng)文件缺失肚菠,值后發(fā)現(xiàn)這些文件可以在dll_exclude[]屬性中設(shè)置不包含進(jìn)來(lái)。在使用Win7系統(tǒng)時(shí)罩缴,并沒有出現(xiàn)文件缺失蚊逢。參考以下文件,其中包括:
"api-ms-win-core-string-l1-1-0",
"api-ms-win-core-libraryloader-l1-2-1.dll",
"api-ms-win-core-profile-l1-1-0.dll",
"api-ms-win-core-processthreads-l1-1-2.dll",
"api-ms-win-core-handle-l1-1-0.dll",
"api-ms-win-core-registry-l1-1-0.dll",
"api-ms-win-core-file-l1-2-1.dll",
"api-ms-win-core-heap-l1-2-0.dll",
"api-ms-win-core-version-l1-1-1.dll",
"api-ms-win-core-heap-l2-1-0.dll",
"api-ms-win-core-io-l1-1-1.dll",
"api-ms-win-core-localization-l1-2-1.dll",
"api-ms-win-core-sysinfo-l1-2-1.dll",
"api-ms-win-core-synch-l1-2-0.dll",
"api-ms-win-core-errorhandling-l1-1-1.dll",
"api-ms-win-core-version-l1-1-0.dll",
"api-ms-win-core-string-l2-1-0.dll",
"api-ms-win-security-base-l1-2-0.dll",
"api-ms-win-eventing-provider-l1-1-0.dll",
"api-ms-win-core-com-l1-1-1.dll",
"api-ms-win-core-memory-l1-1-2.dll"
2箫章、MemoryLoadLibrary failed loading cv2.pyd此錯(cuò)誤通過修改zipfile = None烙荷,使其生成打包文件后解壓縮。再打開程序時(shí)檬寂,程序打包成功终抽,可正常運(yùn)行。
Py2exe打包腳本屬性設(shè)置問題:
1、Version昼伴,Description匾旭,Name不是必須的。
2圃郊、Windows 創(chuàng)建一個(gè)圖形用戶界面程序
3价涝、Console 創(chuàng)建一個(gè)控制臺(tái)程序
4、dist_dir 打包生成的文件放在dist下持舆,可設(shè)置存放目錄(一般沒有特殊要求色瘩,可以不需修改±袅可使用相對(duì)路徑)
5泞遗、Compressed默認(rèn)為0,1為指定壓縮文件(library.zip)的行為;0為不壓縮席覆。
6史辙、Zipfiles 來(lái)配置共享壓縮文件的生成目錄和文件名,默認(rèn)是在目錄 dist 下生成一個(gè) “l(fā)ibrary.zip”文件佩伤,打包了 .exe文件運(yùn)行需要的 .pyd 和 .dll 文件(不包含配置文件等)聊倔。
7、Optimize 打包優(yōu)化生巡,合法值是字符串('','O','OO')或者整型數(shù)字 (0, 1, or 2)耙蔑。0時(shí),不進(jìn)行優(yōu)化孤荣,壓縮包大小較大甸陌,打包的編譯文件為 .pyc;1時(shí)盐股,進(jìn)行少量?jī)?yōu)化钱豁,壓縮包大小略小,打包的編譯文件為 .pyo疯汁;2時(shí)牲尺,優(yōu)化級(jí)別最高,壓縮包大小也明顯變小幌蚊,打包的編譯文件為 .pyo谤碳。
8、Bundle_files 打包綁定溢豆,64位不支持此屬性蜒简。 0:pyd和dll文件不會(huì)被打包到exe文件中; 1:pyd和dll文件會(huì)被打包到exe文件中,且不能從文件系統(tǒng)中加載python模塊; 2:pyd和dll文件會(huì)被打包到exe文件中沫换,但是可以從文件系統(tǒng)中加載python模塊臭蚁。
注:.py: 這是編寫的源文件最铁。
????.pyc: 這是編譯過的二進(jìn)制代碼文件. 如果導(dǎo)入一個(gè)模塊, python 將創(chuàng)建一個(gè) *.pyc 文件,文件中內(nèi)為二進(jìn)制碼垮兑,這樣可以在再次導(dǎo)入時(shí)更容易(更快)冷尉。
.pyo: 這是一個(gè)當(dāng)優(yōu)化等級(jí) (-O) 開啟時(shí)生成的 *.pyc 文件。
.pyd:這個(gè)相當(dāng)于一個(gè)windows dll文件.實(shí)際上.pyd文件就是dll文件系枪,只是略有不同雀哨。
9、Date_files文件可執(zhí)行文件所需數(shù)據(jù)私爷。在python27中雾棺,需要的MSVCP90.dll不能單獨(dú)發(fā)布,必須確保py2exe復(fù)制所有的三個(gè)dll文件和manifest文件到工程目錄dist下衬浑,并且放在一個(gè)名為'Microsoft.VC90.CRT'的子目錄下捌浩。
參考做法為:from glob import glob ?data_files =[("Microsoft.VC90.CRT",glob(r'C:\Program Files\Microsoft Visual Studio freeze_support9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
10、ascii ?0:不包含編碼和解碼器工秩;1則反之尸饺。
11、出現(xiàn)的QPixmap::scaled: Pixmap is a null pixmap問題助币,這是由于pyqt和qt都是默認(rèn)的png格式的圖片浪听,打包后,會(huì)找不到j(luò)pg格式的圖片眉菱,所以在打包過程中需要把pyqt4文件中的imageformats文件夾下的dll文件導(dǎo)入迹栓。這是jpg格式的圖片需要的插件。
12俭缓、類標(biāo)識(shí)符無(wú)屬性克伊,產(chǎn)生的CLSID無(wú)屬性。
typelibs 列表:需要包含的gen_py產(chǎn)生的typelibs
13华坦、多進(jìn)程打包遇到的程序不正常執(zhí)行問題答毫,需要在多進(jìn)程之前調(diào)用freeze_support()函數(shù)。經(jīng)試驗(yàn)季春,最好在函數(shù)開始執(zhí)行的時(shí)候,首先調(diào)用此函數(shù)消返。