1. 手動制作python的exe可執行程序Python沒有內建一個編譯為exe的功能。給python程序的部署帶來不少的麻煩。所以就會出現一些py2exe之類的很不錯的工具,用于自動把.py文件編譯為.exe文件。
最近抽空研究了一下手動實現類似py2exe的功能,希望加強對python的了解。結果還相當不錯。把結果記錄下來,與大家共享。
1.1. 原理文中所描述的方法,基于python的以下幾個功能
1) python程序運行時,會在sys.path指定的路徑中查找庫文件。
2) python從2.3開始,支持從zip文件中import庫(支持.py,.pyc和.pyo,但不支持.pyd)
3) python提供C API,讓c語言的程序,可以很方便的調用python的程序
1.2. 實際步驟注:假設python安裝在c:/python25目錄中,最后的可執行文件放到d:/dist目錄中
1) 先去c:/python25/Lib目錄,把所有文件都復制出來,比如復制到d:/pythonlib目錄中
2) 開一個cmd窗口,進入d:/pythonlib目錄中,運行 python -OO compileall.py -f . 把lib中的.py文件都編譯成.pyo文件
3) 刪除d:/pythonlib目錄中所有的.py和.pyc文件,因為我們只要有.pyo文件就可以讓這些庫運行了。
4) 刪除目錄中所有用不著的文件,比如curses,test,idlelib,msilib等,以減少生成文件的體積。
5) 把這些庫打包成一個zip文件,比如stdlib.zip,放到d:/dist目錄中
6) 把c:/python25/dlls目錄中的.pyd和.dll文件,復制到d:/dist/dlls目錄中,當然,刪除不可能用到的一些文件_msi.pyd,_ssl.pyd等等,可以減少文件的體積
7) 把自己寫的程序,也按步驟2至步驟5所說的方法,打成一個mysrc.zip包,放到d:/dist目錄中。 注意:自己寫的程序的入口應該是main.pyo文件
8) 用以下C程序編譯出一個可執行文件,比方說叫runpy.exe,也放到d:/dist中。
代碼如下:
#include <Python.h>
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
// 得到當前可執行文件所在的目錄
char szPath[10240];
char szCmd[10240];
GetModuleFileName(NULL, szPath, sizeof(szPath));
char* p = strrchr(szPath, '//');
if (p == NULL)
{
printf("Get module file name error!/n");
return -1;
}
*p = 0;
// 設定運行時的PATH
新聞熱點
疑難解答