python打包成為exe文件


pyinstaller 庫的使用

PyInstaller是一個十分有用的第三方庫,它能夠在Windows、Linux、Mac OS X 等操作系統下將 Python 源文件打包,通過對源文件打包,Python 程序可以在沒有安裝 Python 的環境中運行,也可以作為一個獨立文件方便傳遞和管理。PyInstaller 需要在命令行(控制台)下用pip 工具安裝,如下:
:\>pip install pyinstaller
 
:\>pip3 install pyinstaller

PyInstaller 的官方網站網址為 http://www.pyinstaller.org/。PyInstaller 庫會自動將 PyInstaller 命令安裝到 Python 解釋器目錄中,與 pip 或 pip3 命令路徑相同,因此可以直接使用。使用PyInstaller 庫十分簡單,請注意,由於 PyInstaller 不支持源文件命中有英文句號(.)存在,假設 dpython.py 文件在 D:\codes 目錄中,命令如下:

:\>pyinstaller dpython.py
:\>pyinstaller D:\codes\dpython.py
執行完畢后,源文件所在目錄將生成 dist 和 build 兩個文件夾。其中,build 目錄是 pyinstaller 存儲臨時文件的目錄,可以安全刪除。最終的打包程序在 dist 內部的 dpython 目錄中。目錄中其他文件是可執行文件 dpython.exe 的動態鏈接庫。可以通過-F 參數對 Python 源文件生成一個獨立的可執行文件,如下:
:\>pyinstaller -F dpython.py
執行后在 dist 目錄中出現了 dpython.exe 文件,沒有任何依賴庫,執行它即可。使用 PyInstaller 庫需要注意以下問題:文件路徑中不能出現空格和英文句號(.);源文件必須是 UTF-8 編碼,暫不支持其他編碼類型。采用 IDLE編寫的源文件都保存為 UTF-8 編碼形式,可直接使用。PyInstaller 有一些常用參數,如下所示:
-h, --help 查看幫助
-v, --version 查看 PyInstaller 版本
--clean 清理打包過程中的臨時文件
-D, --onedir 默認值,生成 dist 目錄
-F, --onefile 在 dist 文件夾中只生成獨立的打包文件第 
-p DIR, --paths DIR 添加 Python 文件使用的第三方庫路徑
-i <.ico or .exe,ID or .icns>,--icon <.ico or .exe,ID or .icns >指定打包程序使用的圖標(icon)文件

PyInstaller 命令不需要在 Python 源文件中增加代碼,只需要通過命令行進行打包即可。-F 參數最為常用,對於包含第三方庫的源文件,可以使用-p 添加第三方庫所在路徑。如果第三方庫由 pip 安裝且在Python 環境目錄中,則不需要使用-p 參數。

 

 

python打包發布

跟所有python小白一樣,我也遇到了python打包發布的問題!

進過2天的不斷百度谷歌,終於解決了這個蛋疼的問題;過程中遇到了一些問題,記錄下來以免遺忘!

先用了py2exe,由於項目里面需要訪問oracle數據庫,導入cx_oracle模塊,就是這個蛋疼的東西坑咯!

安裝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.dll

這樣打包就完成了, 問題也來了, 用64位的python,其它模塊都是64位的,打包出來的64位程序在64位系統上運行沒有問題, 用32位的python(其它也是32位)打包出來的程序在windows server 2003服務器系統上,始終不能正常運行,經調試是導入cx_oracle模塊出錯,“ Loaded failed ,找不到指定的模塊”  復制各種dll進去都沒解決到;最后放棄py2exe

 

改用pyinstall

 

1、下載pyinstaller

目前pyinstaller支持的python版本為2.3-2.7,可以到http://www.pyinstaller.org/官網下載。

2、安裝

下載完成后,解壓即可。

3、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模塊的問題;
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM