使用PyInstaller打包Python程序
使用PyInstaller打包Python程序
PyInstaller介紹:
PyInstaller是一個能將Python程序轉換成單個可執行文件的程序, 操作系統支持Windows, Linux, Mac OS X, Solaris和AIX。并且很多包都支持開箱即用,不依賴環境。
環境為windows7操作系統,python2.7.8 virtual environment
官網:https://github.com/pyinstaller/pyinstaller
詳細步驟:
1. win7下面先安裝這個依賴:pywin32,下載下來后切換到venv2.7,然后使用easy_install xxx.exe安裝
2. pip安裝PyInstaller:
1
|
|
3. 打包過程中可能會出現msvcp90.dll找不到的問題, 去http://cn.dll-files.com/msvcp90.dll.html下載第三個zip文件, 解壓后放到C:\Windows\System32,如果是64位的還要放到C:\Windows\SysWOW64目錄下。
4. 再次運行報MSVCR90.dll找不到,同理去http://cn.dll-files.com/MSVCR90.dll.html下載MSVCR90.dll, 放到C:\Windows\System32和C:\Windows\SysWOW64中。
5. 將你的整個程序先復制到某個臨時文件夾下面,比如D:\tmp\core-wxpython,此目錄下有個main.py是執行入口
6. 執行build命令,并添加必要的搜索路徑,外加執行文件的圖標:
1
2
|
|
如果還想添加自定義的依賴庫,就要加上-p參數:
1
|
|
參數說明:
-F 表示生成單個可執行文件
-w 表示去掉控制臺窗口,這在GUI界面時非常有用。不過如果是命令行程序的話那就把這個選項刪除吧!
-p 表示你自己自定義需要加載的類路徑,一般情況下用不到
-i 表示可執行文件的圖標
注意的事情
1). 檢查生成的\XXX\build\pyi.win32\XXX\warnXXX.txt(XXX是你的項目名)中, 是否缺少了必要的模塊。如果有缺少的,那么去如上所述,添加必要的搜素路徑, 使得pyinstaller在運行時,可以找到對應的模塊并集成進來。
2). 此處我這里沒有UPX,暫時沒去折騰。估計是用UPX去壓縮,壓縮后所生成的exe文件的大小,會小得多。
7. 如果發現報錯:pywintypes.error: (193, ‘LoadLibraryEx’… ) 原因是添加圖標后綴必須是xxx.ico才行,重新去網上下載一個ico格式的圖片,再次運行就好了。
8. 我測試了一個使用wxpython寫的gui程序,源碼里面引用了一張圖片, 使用wx.Image(os.path.abspath(file/me.jpg), wx.BITMAP_TYPE_JPEG)來加載, 然后打包成exe后發現找不到圖片了,報錯。
解決辦法:
第一步,在程序中將資源文件都放到一個單獨的文件夾中,比如項目根目錄下面的resources
第二步,修改程序中引用這些資源文件比如圖片的代碼:
1
2
3
4
5
6
7
|
|
然后每次在獲取圖片的時候,這么引用它的目錄:
1
|
|
第三步,先運行第6步生成一個main.spec文件
第四步,修改main.spec文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
|
注意:我在a.datas下面添加了那行配置,具體的路徑自己去修改下。
上面是添加單個文件,如果有多個文件,可以一個個的添加。不過如果文件多了話,那么就使用下面的方法:
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
31
32
33
34
35
36
37
|
|
它會把某個指定的文件下的所有文件遞歸的添加到最終的包中。省去很多事情!
第五步,執行:pyinstaller D:\tmp\core-wxpython\main.spec
然后就大功告成了!!!在dist目錄下面有個main.exe單獨的可執行文件,打開它吧。^_^
如果在執行過程中出錯,或者雙擊打開沒任何反應。 可以先去掉-w參數后,在控制臺窗口打開這個可執行文件,會輸出詳細出錯信息去調試。
其他問題記錄
1. 找不到pkg_resources
ImportError: No module named pkg_resources
解決辦法是在安裝pycrypto之前,先安裝distribute庫
1
|
|
然后再安裝windows下面對應的pycrypto庫
1
2
|
|
2. 打包時加上-w選項去掉console時出錯
不要在程序中使用任何print語句,或者是你將stdout重定向到一個日志、文件或任何其他非控制臺地方。
最好的方法是利用日志功能,將輸出定向到日志文件中去,在main函數開頭添加如下代碼:
1
2
3
4
5
|
|
用到logging的時候,需要配置日志到文件中,而不是console:
1
2
|
|
3. pyinstaller用one file方式打包的程式如果有用到subprocess.Popen會有問題
問題參考:http://www.pyinstaller.org/ticket/597
最後找到的方法是 http://code.activestate.com/recipes/578300-python-subprocess-hide-console-on-windows/
建立一個隱藏窗口,就正常了~
最后用pyinstaller設one folder & no console打包都不跳出小窗口了
解決辦法就是自定義一個subprocess_call函數來代替subprocess的call調用,不適用Popen了:
1
2
3
4
5
6
7
8
9
10
11
|
|
調用方法:
1
|
|
這個方法會等命令執行完成,返回值為0表示正常結束!
4. 打包后不能放到中文路徑下執行 解決辦法是下載安裝PyInstaller的中文支持庫,安裝后再重新執行pyinstaller打包命令:
1
2
3
|
|

浙公網安備 33010602011771號