python并不是虛擬機,運行python文件的是python解釋器。python解釋器的工作原理如下:
一、過程概述
1、python先把代碼(.py文件)編譯成字節碼,交給字節碼虛擬機,然后虛擬機會從編譯得到的PyCodeObject對象中一條一條執行字節碼指令,并在當前的上下文環境中執行這條字節碼指令,從而完成程序的執行。Python虛擬機實際上是在模擬操作中執行文件的過程。PyCodeObject對象中包含了字節碼指令以及程序的所有靜態信息,但沒有包含程序運行時的動態信息——執行環境(PyFrameObject)
2、字節碼在python虛擬機程序里對應的是PyCodeObject對象;
.pyc文件是字節碼在磁盤上的表現形式。
3、從整體上看:OS中執行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和PyTreadState。即:每個PyThreadState都對應著一個幀棧,python虛擬機在多個線程上切換。當python虛擬機開始執行時,它會先進行一些初始化操作,最后進入PyEval_EvalFramEx函數,它的作用是不斷讀取編譯好的字節碼,并一條一條執行,類似CPU執行指令的過程。函數內部主要是一個switch結構,根據字節碼的不同執行不同的代碼。
二、關于.pyc文件
PyCodeObject對象的創建時機是模塊加載的時候,即import。
1、執行pythontest.py會對test.py進行編譯成字節碼并解釋執行,但不會生成test.pyc
2、如果test.py中加載了其他模塊,如importurllib2,那么python會對urllib2.py進行編譯成字節碼,生成urllib2.pyc,然后對字節碼解釋執行。
3、如果想生成test.pyc,我們可以使用python內置模塊py_compile來編譯。
也可以執行命令python-mtest.py這樣,就生成了test.pyc
4、加載模塊時,如果同時存在.py和.pyc,python會使用.pyc運行,如果.pyc的編譯時間早于.py的時間,則重新編譯.py,并更新.pyc文件。
以上內容為大家介紹了Python培訓之python是虛擬機嗎,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。