跟全部python小白同樣,我也遇到了python打包發佈的問題!python
進過2天的不斷百度谷歌,終於解決了這個蛋疼的問題;過程當中遇到了一些問題,記錄下來以避免遺忘!數據庫
先用了py2exe,因爲項目裏面須要訪問oracle數據庫,導入cx_oracle模塊,就是這個蛋疼的東西坑咯!windows
安裝cx_oracle的過程就很少說了 這個帖子講得很清楚:http://evil850209.iteye.com/blog/1394932安全
Oracle Instant Client 設置環境變量是讓python能夠取到oci.dll,因此不少人把oci.dll, oraocci11.dll,oraociei11.dll都放到了Python27\Lib\site-packages目錄下面,也能解決問題;服務器
用py2exe打包後 dist裏面有一個msvcp80.dll的文件,系統版本不同名稱不同,有多是msvcp90.dll、msvcp71.dlloracle
這樣打包就完成了, 問題也來了, 用64位的python,其它模塊都是64位的,打包出來的64位程序在64位系統上運行沒有問題, 用32位的python(其它也是32位)打包出來的程序在windows server 2003服務器系統上,始終不能正常運行,經調試是導入cx_oracle模塊出錯,「 Loaded failed ,找不到指定的模塊」 複製各類dll進去都沒解決到;最後放棄py2exe工具
改用pyinstallpost
一、下載pyinstaller網站
目前pyinstaller支持的python版本爲2.3-2.7,能夠到http://www.pyinstaller.org/官網下載。
二、安裝
下載完成後,解壓便可。
三、pyinstaller使用方法
使用也很是的簡單,cmd下進入解壓出來的目錄,執行以下命令。
python pyinstaller.py [opts] yourprogram.py
主要選項包括:
-F, –onefile 打包成一個exe文件。 -D, –onedir 建立一個目錄,包含exe文件,但會依賴不少文件(默認選項)。 -c, –console, –nowindowed 使用控制檯,無界面(默認) -w, –windowed, –noconsole 使用窗口,無控制檯
更詳細的使用方法請參考下載包裏的doc目錄下的Manual.html文件。
使用pyinstall的問題:
打包時出現相似這種狀況:
File "C:\Python27\lib\ctypes\util.py", line 54, in find_library fname = os.path.join(directory, name) File "C:\Python27\lib\ntpath.py", line 108, in join path += "\\" + b UnicodeDecodeError: 'ascii' codec can't decode byte 0xc1 in position 9: ordinal not in range(128)
【緣由】
安裝過程須要訪問用戶文件夾:
5490 INFO: Updating manifest in C:\Users\梁鑫輝\AppData\Roaming\pyinstaller\bincache00_py27_32bit\python27.dll
若是用戶名是中文,不識別。
【解決辦法】
修改ntpath.py
,將import sys
改成:
import sys reload(sys) sys.setdefaultencoding("gbk")
問題2:manifest could not be extracted
【現象】
程序運行時出現這個錯誤:
manifest could not be extracted
【緣由】
不明。
【解決辦法】
開始用
python pyinstaller.py -F test.py
打包成一個單一的文件,
換成
python pyinstaller.py -D test.py
生成一個目錄 ,這樣會把全部須要的dll都放在目錄下面;解決問題;
py2exe 和pyinstall 的對比; pyinstall會把須要的dll文件都複製過來,比較齊全;適合windows;在百度的時候看到有人說 py2exe是 用什麼系統打包發佈的,運行環境也最好是一樣的系統,未證明;
經過
python pyinstaller.py -D test.py 完美解決windows server 2003 沒法導入cx_oracle模塊的問題;