日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
內(nèi)核級(jí)Python:調(diào)試Python編譯器源碼

[[429336]]

python編譯器在執(zhí)行時(shí),給它指定要執(zhí)行的源碼文件,或者說(shuō)直接輸入源碼字符串就可以驅(qū)動(dòng)腳本的執(zhí)行流程,其基本框架如下:

input層是python編譯器用于獲取源碼的輸入方式,事實(shí)上Python能夠有多種方式將源碼信息傳遞給編譯器,例如:

1,執(zhí)行python -c 然后接著python代碼字符串。

2,python -m 然后跟著要執(zhí)行的模塊名

3,python 然后跟著腳本文件的路徑

4,通過(guò)管道連接方式執(zhí)行,例如 cat [file] | python

Python解釋器不關(guān)心代碼如何輸入,只要它能獲取源碼內(nèi)容即可,因此它專(zhuān)門(mén)設(shè)立了一個(gè)輸入層來(lái)處理源碼的讀入。一旦獲得源碼內(nèi)容后,解釋器需要做三個(gè)動(dòng)作,第一個(gè)是設(shè)置編譯選項(xiàng),如果你用過(guò)g++, gcc這類(lèi)編譯器,你一定了解執(zhí)行時(shí)要有很多設(shè)置開(kāi)關(guān)或選項(xiàng),圖中的configuration模塊就負(fù)責(zé)這些選項(xiàng)的設(shè)置,State用來(lái)存儲(chǔ)腳本中設(shè)定的各種變量,Module通過(guò)解讀腳本后生成的一種便于腳本執(zhí)行的數(shù)據(jù)結(jié)構(gòu)。

以下我們會(huì)描述一些代碼和數(shù)據(jù)結(jié)構(gòu),我們大概知道即可,不需要掌握或完全理解。我們看看解釋器在運(yùn)行腳本前進(jìn)行相關(guān)配置的代碼,相關(guān)代碼在python目錄下的initconfig.h和initconfig.c中。打開(kāi)initconfig.c,然后搜索PyPreConfig結(jié)構(gòu)體對(duì)象,然后按住ctrl并點(diǎn)擊它就可以打開(kāi)它的定義,它有些字段需要注意:

1,int allocator , 該字段對(duì)應(yīng)內(nèi)存分配器類(lèi)型,它其實(shí)是個(gè)枚舉值,用來(lái)選取不同的內(nèi)存分配器。

2,int isolatd, 設(shè)置隔離模式,應(yīng)該對(duì)應(yīng)python虛擬執(zhí)行環(huán)境,在該環(huán)境里進(jìn)行pip安裝或是環(huán)境變量配置不會(huì)對(duì)全局環(huán)境產(chǎn)生影響。

3,int utf8_mode , 設(shè)置utf-8模式

在initconfig.c中搜索PyConfig,這個(gè)結(jié)構(gòu)體用于運(yùn)行時(shí)配置,例如設(shè)置解釋器在執(zhí)行腳本時(shí)是出于調(diào)試模式還是優(yōu)化模式,它還記錄了一些涉及到運(yùn)行時(shí)的環(huán)境變量配置。接下來(lái)我們?cè)诮忉屍髟创a中設(shè)置斷點(diǎn)對(duì)其執(zhí)行進(jìn)行調(diào)試體驗(yàn),操作如下圖所示:

首先在python模塊右鍵,選中屬性,點(diǎn)擊調(diào)試,在命令參數(shù)中輸入python -v -c “print(‘hello world’)”,然后在函數(shù)config_parse_cmdline中設(shè)置斷點(diǎn),該函數(shù)應(yīng)該在1875行,這個(gè)函數(shù)用于解讀執(zhí)行python解釋器時(shí)的命令行參數(shù),設(shè)置好后點(diǎn)擊F5啟動(dòng)調(diào)試,我們會(huì)看到VS停在斷點(diǎn)設(shè)置的地方,然后點(diǎn)擊F10單步,我們可以看看該函數(shù)前面幾個(gè)變量的內(nèi)容:

從中我們能看到Python解釋器對(duì)應(yīng)的可執(zhí)行文件為python_d.exe,繼續(xù)往下走可以看到代碼進(jìn)入case ‘v’,這里打開(kāi)了verbose模式,這樣Python解釋器執(zhí)行時(shí)會(huì)把很多信息打印出來(lái)。接下來(lái)在main.c中的pymain_run_command函數(shù)中設(shè)置斷點(diǎn),這個(gè)函數(shù)會(huì)調(diào)用一系列函數(shù)執(zhí)行源碼,該文件在Module目錄下,

 

里面的PyRunSimpleStringFlags函數(shù)作用就是執(zhí)行源碼,我們單步運(yùn)行該函數(shù),然后打開(kāi)控制臺(tái)就會(huì)看到hello輸出來(lái)了。上面代碼中函數(shù)PyRunSimpleStringFlags的作用就是創(chuàng)建一個(gè)Module對(duì)象,一個(gè)Module對(duì)象就是含有__main入口的可執(zhí)行模塊。

 


網(wǎng)頁(yè)題目:內(nèi)核級(jí)Python:調(diào)試Python編譯器源碼
URL地址:http://www.5511xx.com/article/dpeoesj.html