亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過(guò)程分享

系統(tǒng) 1554 0

1. 手動(dòng)制作python的exe可執(zhí)行程序Python沒(méi)有內(nèi)建一個(gè)編譯為exe的功能。給python程序的部署帶來(lái)不少的麻煩。所以就會(huì)出現(xiàn)一些py2exe之類(lèi)的很不錯(cuò)的工具,用于自動(dòng)把.py文件編譯為.exe文件。

最近抽空研究了一下手動(dòng)實(shí)現(xiàn)類(lèi)似py2exe的功能,希望加強(qiáng)對(duì)python的了解。結(jié)果還相當(dāng)不錯(cuò)。把結(jié)果記錄下來(lái),與大家共享。

1.1. 原理文中所描述的方法,基于python的以下幾個(gè)功能?

? 1) python程序運(yùn)行時(shí),會(huì)在sys.path指定的路徑中查找?guī)煳募?
? 2) python從2.3開(kāi)始,支持從zip文件中import庫(kù)(支持.py,.pyc和.pyo,但不支持.pyd)
? 3) python提供C API,讓c語(yǔ)言的程序,可以很方便的調(diào)用python的程序

1.2. 實(shí)際步驟注:假設(shè)python安裝在c:\python25目錄中,最后的可執(zhí)行文件放到d:\dist目錄中?

? 1) 先去c:\python25\Lib目錄,把所有文件都復(fù)制出來(lái),比如復(fù)制到d:\pythonlib目錄中
? 2) 開(kāi)一個(gè)cmd窗口,進(jìn)入d:\pythonlib目錄中,運(yùn)行 python -OO compileall.py -f . 把lib中的.py文件都編譯成.pyo文件
? 3) 刪除d:\pythonlib目錄中所有的.py和.pyc文件,因?yàn)槲覀冎灰?pyo文件就可以讓這些庫(kù)運(yùn)行了。
? 4) 刪除目錄中所有用不著的文件,比如curses,test,idlelib,msilib等,以減少生成文件的體積。
? 5) 把這些庫(kù)打包成一個(gè)zip文件,比如stdlib.zip,放到d:\dist目錄中
? 6) 把c:\python25\dlls目錄中的.pyd和.dll文件,復(fù)制到d:\dist\dlls目錄中,當(dāng)然,刪除不可能用到的一些文件_msi.pyd,_ssl.pyd等等,可以減少文件的體積
? 7) 把自己寫(xiě)的程序,也按步驟2至步驟5所說(shuō)的方法,打成一個(gè)mysrc.zip包,放到d:\dist目錄中。 注意:自己寫(xiě)的程序的入口應(yīng)該是main.pyo文件
? 8) 用以下C程序編譯出一個(gè)可執(zhí)行文件,比方說(shuō)叫runpy.exe,也放到d:\dist中。

復(fù)制代碼 代碼如下:

#include
#include
#include
#include

int main()
{
?????? // 得到當(dāng)前可執(zhí)行文件所在的目錄
?????? 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;

?????? // 設(shè)定運(yùn)行時(shí)的PATH
?????? sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);
?????? _putenv(szCmd);

?????? // 把sys.path設(shè)定為['.', '自己的源代碼zip文件', '標(biāo)準(zhǔn)庫(kù)zip文件', 'dll目錄']
?????? // 然后調(diào)用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目錄中。

結(jié)束語(yǔ)

這樣來(lái),d:\dist目錄中,一共只有4個(gè)文件加一個(gè)目錄:
dlls目錄:用于存放所有的dll文件和pyd文件
stdlib.zip文件:用于存放所有的python的.pyo文件格式的標(biāo)準(zhǔn)庫(kù)
mysrc.zip文件:用于存放自己寫(xiě)的程序。注意,自己寫(xiě)的程序的入口在main.pyo中。
runpy.exe文件:程序的啟動(dòng)文件,啟動(dòng)后會(huì)設(shè)定python的sys.path,然后調(diào)用main模塊
python25.dll文件:python的核心dll,runpy.exe依賴于這個(gè)dll

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 18p爽视频在线观看免费 | 日韩一区国产二区欧美三区 | 亚洲线精品久久一区二区三区 | 久久精品国产久金国产思思 | 在线免费黄色片 | 2020年国产高中毛片在线视频 | 亚洲精品6久久久久中文字幕 | 亚洲视频手机在线观看 | 黄色免费网站在线观看 | 日韩欧美在线中文字幕 | 欧美综合色区 | 日本不卡一区二区三区 | 四虎www成人影院 | 亚洲免费视频在线观看 | 欧美一级精品高清在线观看 | 久久免费观看国产精品 | 青青热久免费精品视频精品 | 日本又黄又爽又色的视频免费 | 天天射综合 | 狠狠色丁香婷婷久久综合考虑 | 在线免费观看a视频 | 国产伦精品一区二区三区视频小说 | 亚洲欧美综合 | 久草在线视频资源 | 国产日韩欧美精品 | 精品视频一二三区 | 国产精品剧情原创麻豆国产 | 欧美精品午夜毛片免费看 | 久热这里只有精 | 久久精品94精品久久精品 | 免费一级大毛片a一观看不卡 | 成人欧美一区二区三区视频 | 欧美精品 在线播放 | 精品久久久久久18免费看 | 国产精品久久久久影视不卡 | 午夜一级毛片看看 | 国产精品免费视频一区 | 久久亚洲美女久久久久 | 欧美国产日韩一区二区三区 | 在线成人爽a毛片免费软件 在线成人天天鲁夜啪视频 在线成人亚洲 | 美女黄频网站 |