• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    python2exe源碼分析

    發布: 2007-6-11 15:03 | 作者: xiaoyao | 來源: | 查看: 34次 | 進入軟件測試論壇討論

    領測軟件測試網

    python2exe工作原理

    python2exe使用python的modualfinder來調入要運行的scripts并且尋找運行它所需要的所有python模塊和擴展模塊。純python的模塊在臨時目錄里被編譯成.pyc(debug)和.pyo(optimized)的文件。編譯后的擴展模塊pyd文件也能找到。

    最后生成一個與zip兼容的包,包含一個dependency目錄和你的script,這個包最后提供給一個py2exe自帶的python解釋器。運行生成的程序,將建立一個重要的關聯,這樣在script開始運行的時候,必要的模塊可以從zip包中正確地import.

    由于擴展模塊不能從zip包中包含或import,它們以被單讀提供。放在dist\myscript目錄下。相似的工作:Gordon McMillan's installer(更成熟一些)

    python2exe代碼分析

    解碼的過程

    main, winmain調用start函數。

    start:

    1)獲得目錄名和文件名(GetModuleFileName)

    2)取出執行文件的數據(MapExistingFile)

    3)獲得script的信息(GetScriptInfo)

    4)用_putenv設置用戶的環境變量(PYTHONHOME,PYTHONPATH,PYTHONOPTIMIZE,PYTHONDEBUG等)

    5)將scriptinfo種的信息來設置python內部變量(Py_NoSiteFlag, Py_VerboseFlag等)

    6)Py_Initialize()

    7)PySys_SetArgv(argc, argv)

    8)調用BuildToc獲得toc(dict對象)

    9)調用PyRun_SimpleString執行"import sys; sys.path=[r'%s']"

    10)調用Load_Module調入imputil模塊,調用PyRun_SimpleString執行"import imputil"

    11)Py_InitModule("__main__", methods);

    12)解出Scripts\\support.py并運行它

    13)解出Scripts\\__main__.py并運行它(這里的__main__.py就是要打包的python文件,被重命名為__main__.py)source\start.c:

    1. MapExistingFile:用文件映像的方法打開文件,讀處理里面的內容

    2. GetScriptInfo: 從archive.h中定義的(central directory record)格式的數據中取出script info(optimize, verbose, tag)到全局變量p_script_info中。具體地說明在http://ww.pkware.com/appnote.html

    3. BuildToc:構造一個新的dict對象,在arch文件中做一個循環,取出所有的name放入dict中(PyDict_SetItem),其中調用了fixpath來解決"\"和"/"的統一問題,并將dict返回(注意,name好像是不帶后綴的)

    4. extract_data: 使用zlib.h中定義的zstream結構,從archive結構中獲得指定的長度的數據

    5. GetContentsFromOffset:計算位置,調用extract獲得數據

    6. GetContents:利用PyDict_GetItemString從toc中得到指定的名字的文件的位置,調用GetContentsFromOffset獲得數據

    7. Load_Module:檢查p_script_info->optimize,判斷文件名的后綴是".pyo"還是".pyc",調用GetContents從數據中調出這個文件。

    8. get_code:指定名字,獲得這個文件的內容:GetContents + PyString_FromStringAndSize

    試驗

    用winzip可以打開生成的exe文件,說明這個exe實際是一個zip文件。

    --

    Though hope is frail

    It's hard to kill

    (責任編輯:銘銘)

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>