国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

手動實現把python項目發布為exe可執行程序過程分享

2019-11-25 18:07:48
字體:
來源:轉載
供稿:網友

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
       sprintf(szCmd, "PATH=%s//dlls;%%PATH%%", szPath);
       _putenv(szCmd);

       // 把sys.path設定為['.', '自己的源代碼zip文件', '標準庫zip文件', 'dll目錄']
       // 然后調用main模塊
       sprintf(szCmd,
            "import sys/n"
            "sys.path=['.', r'%s//mysrc.zip', r'%s//stdlib.zip', r'%s//dlls']/n"
            "import main/n",
            szPath, szPath, szPath);
     
       Py_OptimizeFlag = 2;
       Py_NoSiteFlag = 1;
       Py_Initialize();
       PyRun_SimpleString(szCmd);
       return 0;
}

9. 把python25.dll放到d:/dist目錄中。

結束語

這樣來,d:/dist目錄中,一共只有4個文件加一個目錄:
dlls目錄:用于存放所有的dll文件和pyd文件
stdlib.zip文件:用于存放所有的python的.pyo文件格式的標準庫
mysrc.zip文件:用于存放自己寫的程序。注意,自己寫的程序的入口在main.pyo中。
runpy.exe文件:程序的啟動文件,啟動后會設定python的sys.path,然后調用main模塊
python25.dll文件:python的核心dll,runpy.exe依賴于這個dll

--------------------------------------------------------------------------------

哈哈,相當的簡潔明了吧。一共才4個文件一個目錄,5MB都不到哦。
注:當然,這種打包方式第一次做的時候比較麻煩,但之后就可以只要把自己的程序打包就好了,其它的不用變。
而且,如果自己的程序經常做改動的話,自己的程序也可以不打包,直接放到d:/dist中,反正runpy.exe啟動程序的時候,只要能正常運行import main就可以了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桃园县| 新河县| 余姚市| 阿鲁科尔沁旗| 盐津县| 夏河县| 静安区| 格尔木市| 兴仁县| 上杭县| 健康| 无锡市| 达拉特旗| 昌图县| 高陵县| 赣州市| 遵化市| 水富县| 扎鲁特旗| 安顺市| 武安市| 阿克| 澳门| 新宁县| 沈丘县| 法库县| 云林县| 沾化县| 龙门县| 贵德县| 贞丰县| 麻江县| 腾冲县| 岑巩县| 天等县| 长寿区| 道孚县| 南岸区| 古交市| 朔州市| 榆社县|