<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    上善若水
    In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
    posts - 146,comments - 147,trackbacks - 0

    原文來自:http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage
    記錄下來以防以后找不到了。

    Python沒有內(nèi)建一個編譯為exe的功能。給python程序的部署帶來不少的麻煩。

    所以就會出現(xiàn)一些py2exe之類的很不錯的工具,用于自動把.py文件編譯為.exe文件。

    最近抽空研究了一下手動實現(xiàn)類似py2exe的功能,希望加強對python的了解。

    結(jié)果還相當不錯。把結(jié)果記錄下來,與大家共享。

    原理

     

    文中所描述的方法,基于python的以下幾個功能

    1. python程序運行時,會在sys.path指定的路徑中查找?guī)煳募?

    2. python從2.3開始,支持從zip文件中import庫(支持.py,.pyc和.pyo,但不支持.pyd)

    3. python提供C API,讓c語言的程序,可以很方便的調(diào)用python的程序

    實際步驟

     

    注:假設python安裝在c:\python25目錄中,最后的可執(zhí)行文件放到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程序編譯出一個可執(zhí)行文件,比方說叫runpy.exe,也放到d:\dist中。

     

     1#include <Python.h>
     2#include <Windows.h>
     3#include <stdlib.h>
     4#include <stdio.h>
     5
     6int main()
     7{
     8        // 得到當前可執(zhí)行文件所在的目錄
     9        char szPath[10240];
    10        char szCmd[10240];
    11        GetModuleFileName(NULL, szPath, sizeof(szPath));
    12        char* p = strrchr(szPath, '\\');
    13        if (p == NULL)
    14        {
    15                printf("Get module file name error!\n");
    16                return -1;
    17        }

    18
    19        *= 0;
    20
    21        // 設定運行時的PATH
    22        sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);
    23        _putenv(szCmd);
    24
    25        // 把sys.path設定為['.', '自己的源代碼zip文件', '標準庫zip文件', 'dll目錄']
    26        // 然后調(diào)用main模塊
    27        sprintf(szCmd,
    28                "import sys\n"
    29                "sys.path=['.', r'%s\\mysrc.zip', r'%s\\stdlib.zip', r'%s\\dlls']\n"
    30                "import main\n",
    31                szPath, szPath, szPath);
    32        
    33        Py_OptimizeFlag = 2;
    34        Py_NoSiteFlag = 1;
    35        Py_Initialize();
    36        PyRun_SimpleString(szCmd);
    37        return 0;
    38}

    39

     

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

    結(jié)束語

    這樣來,d:\dist目錄中,一共只有4個文件加一個目錄:

    • dlls目錄:用于存放所有的dll文件和pyd文件

    • stdlib.zip文件:用于存放所有的python的.pyo文件格式的標準庫

    • mysrc.zip文件:用于存放自己寫的程序。注意,自己寫的程序的入口在main.pyo中。

    • runpy.exe文件:程序的啟動文件,啟動后會設定python的sys.path,然后調(diào)用main模塊

    • python25.dll文件:python的核心dll,runpy.exe依賴于這個dll


     

    • 哈哈,相當?shù)暮啙嵜髁税伞R还膊?個文件一個目錄,5MB都不到哦。

    注:當然,這種打包方式第一次做的時候比較麻煩,但之后就可以只要把自己的程序打包就好了,其它的不用變。

    而且,如果自己的程序經(jīng)常做改動的話,自己的程序也可以不打包,直接放到d:\dist中,反正runpy.exe啟動程序的時候,只要能正常運行import main就可以了。


     

    有不少人寫email給我,問我要我做的包。大家可以在這里下載基于2.5.2版本的包: python_dist.7z 以及基于3.1.2版本的包: python31-dist.7z

    注:3.1.2依賴于visual c++ 2008 redistributable package. 如果在目標機器上沒有安裝,則程序運行不起來。

    解開包后,只要用自己的程序替換mysrc.zip就可以使用了。

    包里有runpy.exe和runpyw.exe兩個文件。其中,runpy.exe是控制臺程序,runpyw.exe是非控制臺程序。這兩個程序分別類似于python.exe和pythonw.exe。想讓程序運行時出現(xiàn)一個控制臺,就運行runpy.exe,如果不想出現(xiàn)黑黑的控制臺,就運行runpyw.exe。

     

    posted on 2011-12-20 11:48 DLevin 閱讀(1386) 評論(0)  編輯  收藏 所屬分類: 收藏
    主站蜘蛛池模板: 久久精品国产亚洲av麻豆蜜芽| 成人免费淫片在线费观看 | 国产精品偷伦视频免费观看了| 亚洲国产成人精品无码一区二区| 免费人成视网站在线观看不卡| 亚洲三级高清免费| 久久aⅴ免费观看| jzzjzz免费观看大片免费| 亚洲人成人伊人成综合网无码| 亚洲精品在线网站| 亚洲av无码国产精品夜色午夜 | 亚洲日韩国产二区无码| 亚洲国产精品不卡在线电影| 亚洲日本韩国在线| 国产一区二区三区免费看| 成年人网站在线免费观看| 免费在线看v网址| 最近中文字幕大全中文字幕免费| 免费日本一区二区| 嫩草在线视频www免费看| 亚洲免费无码在线| free哆拍拍免费永久视频| 日本黄页网址在线看免费不卡| 亚洲精品久久无码av片俺去也| 亚洲真人无码永久在线观看| 亚洲综合中文字幕无线码| 亚洲高清中文字幕综合网| 亚洲香蕉免费有线视频| 亚洲系列国产精品制服丝袜第| 亚洲视频中文字幕在线| 久久亚洲精品成人AV| 久久亚洲sm情趣捆绑调教| 麻豆亚洲av熟女国产一区二| 亚洲美女视频免费| 亚洲影视自拍揄拍愉拍| 四虎亚洲精品高清在线观看| 亚洲欧美中文日韩视频| 久久精品国产亚洲AV| 男女作爱免费网站| a一级毛片免费高清在线| baoyu116.永久免费视频|