既然Python是用C實現的,那為什麼Python不能直接生成exe呢?

珍懿xbLY4160


C語言其實是一種比較“古老”而且“底層”的語言。其執行效率,僅次於彙編語言。

說其古老,是因為C語言的出現很早。

雖然Fortran、Cobol語言出現比C語言更早,但是現代主流操作系統(Windows、Mac Os、linux、iOS、Android、Unix)全部脫胎於C語言。

說它底層,是因為C語言設計之初就是為了同時編寫彙編語言。理論上可以全部用匯編寫。而彙編語言是執行效率最高的語言。

所以Python用C語言寫一點也不奇怪。這和它能不能生成Exe一點關係都沒有。

Exe文件是Windows平臺的私有格式。最簡單的Exe是Com可執行文件。Exe文件實際上是一個引導程序+一個解釋程序組成的。

Python語言生成的代碼,只需要配以引導程序和解釋程序,就可以作為Exe文件執行。

所以,Python生成Exe文件一點難度都沒有。只是它願不願意提供的問題。


智匯元


任何語言在理論上都是可以生成可執行文件的(exe文件是windows環境下的一種可執行文件),但是實際上由於python在設計之時將其設計成為一個腳本語言,其並沒有相關編譯成可執行文件的編譯器,但有一種方法是進行打包,就是引入PyWin32包後,使用下面的pyinstaller 命令進行打包生成一個exe。

命令格式如下,為方便顯示做了分行處理:

pyinstaller [主文件] -p [其他文件1] -p [其他文件2]

--hidden-import [自建模塊1]

--hidden-import [自建模塊2]


下來,我們說明一個概念。什麼是可執行文件?

PE(Portable Executable)格式,是微軟Win32環境可移植可執行文件(如exe、dll、vxd、sys和vdm等)的標準文件格式。PE格式文件分為PE32和PE64,PE32是win32也就是windows 32位操作系統原生態的可執行文件,其藉助於wow64子系統,可以運行於64位windows環境下。PE64是windows64位操作系統下的可執行文件格式。

在宇宙第一IDE VS環境下,可通過工程配置管理器來選擇生成的exe是32位的還是64位的。

PE文件格式如下圖所示:


我們通過PE文件的格式圖可以看出,PE文件更像一個數據的組織架構圖,其按照嚴格的數據組裝方式進行數據分配管理索引(當然這些是由編譯器和鏈接器最終生成的),而且其代碼最終編譯成與CPU相關的機器碼,其依賴的庫是系統相應的dll動態庫或其它資源。


PYTHON語言一個腳本語言,其運行是通過python解釋器負責執行的。其代碼在運行過程中通過python解釋器將python語言進行翻譯成機器碼,然後再交由CPU去執行。

當然PYTHON也是可以編譯的,不過這裡的編譯只是將腳本代碼翻譯成python對應的字節流,其並不是真正的機器碼。

所以我們可以進行這樣的一個對比說明:

C語言經過編譯鏈接,最終生成了與機器機關的彙編執令,其編譯後文件數據的組織方式為PE格式,其在運行時由進程加載器負責其依賴的系統庫的加載和初始化。而python無論是否編譯,最終是將其python的代碼或者字節流交由python解釋器去解釋執行,其與系統無關,但python解釋器是與系統有關,而且python代碼在使用過程中需要的庫資源由python虛擬機負責加載初始化,並給python提供接口。


而現在python打包生成的exe只是對python腳本、python的解釋器、python腳本需要引入的包和 python虛擬機進行一個打包,並非一個真正意義上的exe文件,其在運行過程中本質是由python解釋器負責解釋python代碼並在其虛擬中執行的。


蝸牛怪


幹嘛非得要生成exe呢?py文件可以直接雙擊運行,和exe一樣的


陽光男孩Y


可以生成的。但是但是py生成exe絕對是你的噩夢。先不說過程的麻煩。單單說生成出來的文件大小都得50m以上!所以現實當中基本沒人這麼幹的。


matrix83


python不是用C實現的,而是利用了CPython解釋器使python的運行效率可以接近C程序。至於為什麼不直接生成exe,因為沒有必要啊,exe是C程序編譯之後執行的,意味著每一次執行python,後端的C解釋器都需要將目前的python代碼翻譯成C代碼,再執行編譯、檢查鏈接等等一系列操作,之後把所有的庫靜態或者動態打包好形成一個exe來供用戶執行,這個效率未免太低了吧?而且在調用庫的時候要如何選擇鏈接方式?使用靜態鏈接的話編譯出來的文件會很大,動態鏈接又不能保證每一個用戶都可以執行,不能保證庫文件已經正確安裝,導致跨平臺性不好。

Python運行原理是運行在C編寫的Python虛擬機上,通過opcode來決定python需要執行的指令,並且可以通過創建線程的方式來提高python的運行效率。只要解釋器生成了對應的機器碼,虛擬機線程可以立刻進入執行狀態,效率比編譯高多了,無論是暫停、修改還是重新運行速度都非常快。


榻榻米的榻榻


理解錯誤。

Python是解析性腳本語言,他的執行過程就是解析的過程,所以本身不需要弄成可執行文件,和PHP一毛一樣。

而C,C++是編譯性語言,所以他們需要編譯器,編譯後的結果,就需要變成可執行文件。

但,並不是不能做成可執行文件,需要對應的工程開發環境,如,Windows下,用Python開發桌面應用,就能打包成exe可執行文件。


劉氓兔


嚴格說來Python的運行環境是C寫的,exe是windwos程序的引導程序。程序運行後就是在運行環境中執行各種操作系統指令,操作系統再將指令轉為系統內核指令,內核指令再轉為cpu指令,從而指揮計算機各硬件協同工作。


csalx


一種是編譯性的,一種是解釋性的,你要知道這兩個的特點就不會這麼問了


用戶104425586802


Exe只是windows的東西而已,windows只是計算機世界的一個面而已,多瞭解一下計算機技術的全貌


zengxi129


這一點上比golang差太遠了[捂臉]


分享到:


相關文章: