python編譯後得到
A. python 「編譯的」 Python 文件的理解是什麼
為了加快載入模塊的速度,Python 會在 __pycache__ 目錄下以 mole.version.pyc 名字緩存每個模塊編譯後的版本,這里的版本編制了編譯後文件的格式。它通常會包含 Python 的版本號。例如,在 CPython 3.3 版中,spam.py 編譯後的版本將緩存為 __pycache__/spam.cpython-33.pyc。這種命名約定允許有不同發布和不同版本的 Python 編譯的模塊同時存在。
Python 會檢查源文件與編譯版的修改日期以確定它是否過期並需要重新編譯。這是完全自動化的過程。同時,編譯後的模塊是跨平台的,所以同一個庫可以在不同架構的系統之間共享。
Python 不檢查在兩個不同環境中的緩存。首先,它會永遠重新編譯而且不會存儲直接從命令行載入的模塊。其次,如果沒有源模塊它不會檢查緩存。若要支持沒有源文件(只有編譯版)的發布,編譯後的模塊必須在源目錄下,並且必須沒有源文件的模塊。
部分高級技巧:
為了減少一個編譯模塊的大小,你可以在 Python 命令行中使用 -O 或者 -OO。-O 參數刪除了斷言語句,-OO 參數刪除了斷言語句和 __doc__ 字元串。
因為某些程序依賴於這些變數的可用性,你應該只在確定無誤的場合使用這一選項。「優化的」 模塊有一個 .pyo 後綴而不是 .pyc 後綴。未來的版本可能會改變優化的效果。
來自 .pyc 文件或 .pyo 文件中的程序不會比來自 .py 文件的運行更快;.pyc 或 .pyo 文件只是在它們載入的時候更快一些。
compileall 模塊可以為指定目錄中的所有模塊創建 .pyc 文件(或者使用 -O 參數創建 .pyo 文件)。
在 PEP 3147 中有很多關這一部分內容的細節,並且包含了一個決策流程。
B. ue5python原理
Python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器一條一條執行位元組碼指令,從而完成程序的執行。
1.1python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器會從編譯得到的PyCodeObject對象中一條一條執行位元組碼指令,
並在當前的上下文環境中執行這條位元組碼指令,從而完成程序的執行。Python解釋器實際上是在模擬操作中執行文件的過程。PyCodeObject對象
中包含了位元組碼指令以及程序的所有靜態信息,但沒有包含程序運行時的動態信息——執行環境(PyFrameObject)
2. 位元組碼
位元組碼在python解釋器程序里對應的是PyCodeObject對象
.pyc文件是位元組碼在磁碟上的表現形式
2.1從整體上看:OS中執行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和
PyTreadState。即:每個PyThreadState都對應著一個幀棧,python解釋器在多個線程上切換。當python解釋器開始執行時,它會先進行一
些初始化操作,最後進入PyEval_EvalFramEx函數,它的作用是不斷讀取編譯好的位元組碼,並一條一條執行,類似CPU執行指令的過程。函數內部
主要是一個switch結構,根據位元組碼的不同執行不同的代碼。
3. .pyc文件
PyCodeObject對象的創建時機是模塊載入的時候,及import
Python test.py會對test.py進行編譯成位元組碼並解釋執行,但是不會生成test.pyc
如果test.py載入了其他模塊,如import urlib2, Python會對urlib2.py進行編譯成位元組碼,生成urlib2.pyc,然後對位元組碼進行解釋
如果想生成test.pyc,我們可以使用Python內置模塊py_compile來編譯。
載入模塊時,如果同時存在.py和pyc,Python會嘗試使用.pyc,如果.pyc的編譯時間早於.py的修改時間,則重新編譯.py並更新.pyc。
4. PyCodeObject
Python代碼的編譯結果就是PyCodeObject對象
typedef struct {
PyObject_HEAD
int co_argcount; /* 位置參數個數 */
int co_nlocals; /* 局部變數個數 */
int co_stacksize; /* 棧大小 */
int co_flags;
PyObject *co_code; /* 位元組碼指令序列 */
PyObject *co_consts; /* 所有常量集合 */
PyObject *co_names; /* 所有符號名稱集合 */
PyObject *co_varnames; /* 局部變數名稱集合 */
PyObject *co_freevars; /* 閉包用的的變數名集合 */
PyObject *co_cellvars; /* 內部嵌套函數引用的變數名集合 */
/* The rest doesn』t count for hash/cmp */
PyObject *co_filename; /* 代碼所在文件名 */
PyObject *co_name; /* 模塊名|函數名|類名 */
int co_firstlineno; /* 代碼塊在文件中的起始行號 */
PyObject *co_lnotab; /* 位元組碼指令和行號的對應關系 */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
} PyCodeObject;
5. .pyc文件格式
載入模塊時,模塊對應的PyCodeObject對象被寫入.pyc文件
6.分析位元組碼
6.1解析PyCodeObject
Python提供了內置函數compile可以編譯python代碼和查看PyCodeObject對象
6.2指令序列co_code的格式
opcode oparg opcode opcode oparg …
1 byte 2 bytes 1 byte 1 byte 2 bytes
Python內置的dis模塊可以解析co_code
7. 執行位元組碼
Python解釋器的原理就是模擬可執行程序再X86機器上的運行,X86的運行時棧幀如下圖
Python解釋器的原理就是模擬上述行為。當發生函數調用時,創建新的棧幀,對應Python的實現就是PyFrameObject對象。
PyFrameObject對象創建程序運行時的動態信息,即執行環境
7.1 PyFrameObject
typedef struct _frame{
PyObject_VAR_HEAD //"運行時棧"的大小是不確定的
struct _frame *f_back; //執行環境鏈上的前一個frame,很多個PyFrameObject連接起來形成執行環境鏈表
PyCodeObject *f_code; //PyCodeObject 對象,這個frame就是這個PyCodeObject對象的上下文環境
PyObject *f_builtins; //builtin名字空間
PyObject *f_globals; //global名字空間
PyObject *f_locals; //local名字空間
PyObject **f_valuestack; //"運行時棧"的棧底位置
PyObject **f_stacktop; //"運行時棧"的棧頂位置
//...
int f_lasti; //上一條位元組碼指令在f_code中的偏移位置
int f_lineno; //當前位元組碼對應的源代碼行
//...
//動態內存,維護(局部變數+cell對象集合+free對象集合+運行時棧)所需要的空間
PyObject *f_localsplus[1];
} PyFrameObject;
每一個 PyFrameObject對象都維護了一個 PyCodeObject對象,這表明每一個 PyFrameObject中的動態內存空間對象都和源代碼中的一段Code相對應。
C. python .pyc是什麼文件
一、什麼是pyc文件?
pyc文件就是py程序編譯後得到的文件,是一種二進制文件。一般是這樣的:
pyc文件經過python解釋器最終會生成機器碼運行。所以pyc文件是可以跨平台部署的,類似Java的.class文件。如果py文件改變,也會重新生成pyc文件。
相關推薦:《Python視頻教程》
二、pyc文件怎麼生成的?
1、被當做模塊調用的時候會自動生成pyc文件。
一般是python腳本被當做模塊被其他腳本文件調用時,就會產生pyc文件,舉個例子:
如果你寫了一個腳本文件image.py是用來生成驗證碼的,如果你在index.py文件中想引用這個腳本的功能,就需要通過import導入image.py文件,然後,如果你運行index.py文件,那就會在image.py文件所在的路徑生成一個image.pyc文件。
2、對於py文件,可以執行下面命令來生成pyc文件。
3、通過代碼來生成pyc文件。
三、為什麼要生成pyc文件?
1、python為了提高運行效率也會進行編譯。
python是解釋型語言,運行的時候需要通過python解釋器編譯,所以先編譯出pyc文件後,可以節省編譯這一步的耗時時間。
2、不想讓源碼泄露。
因為py文件是可以直接看到源碼的,對於一般的商業公司來說,這有點不妙,因為pyc文件可以獨立於py文件,刪除py文件也不會出錯。這就是太好了,只需要編譯成pyc文件再發布出去就好了。
D. python的程序可以編譯成二進制可執行文件么
python下編譯py成pyc和pyo
其實很簡單,
用
python -m py_compile file.py
python -m py_compile /root/src/{file1,file2}.py
編譯成pyc文件。
也可以寫份腳本來做這事:
Code:
import py_compile
py_compile.compile('path') //path是包括.py文件名的路徑
用
python -O -m py_compile file.py
編譯成pyo文件。
1.其中的 -m 相當於腳本中的import,這里的-m py_compile 相當於上面的 import py_compile
2.-O 如果改成 -OO 則是刪除相應的 pyo文件,具體幫助可以在控制台輸入 python -h 查看
========================
from:http://blogold.chinaunix.net/u3/93255/showart_1944929.html
什麼是pyc文件
pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,載入的速度有所提高,而且pyc是一種跨平台的位元組碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的 python是無法執行的。
什麼是pyo文件
pyo是優化編譯後的程序 python -O 源文件即可將源程序編譯為pyo文件
什麼是pyd文件
pyd是python的動態鏈接庫。
為什麼需要pyc文件
這個需求太明顯了,因為py文件是可以直接看到源碼的,如果你是開發商業軟體的話,不可能把源碼也泄漏出去吧?所以就需要編譯為pyc後,再發布出去。當然,pyc文件也是可以反編譯的,不同版本編譯後的pyc文件是不同的,根據python源碼中提供的opcode,可以根據pyc文件反編譯出 py文件源碼,網上可以找到一個反編譯python2.3版本的pyc文件的工具,不過該工具從python2.4開始就要收費了,如果需要反編譯出新版本的pyc文件的話,就需要自己動手了(俺暫時還沒這能力^--^),不過你可以自己修改python的源代碼中的opcode文件,重新編譯 python,從而防止不法分子的破解。
生成單個pyc文件
python就是個好東西,它提供了內置的類庫來實現把py文件編譯為pyc文件,這個模塊就是 py_compile 模塊。
使用方法非常簡單,如下所示,直接在idle中,就可以把一個py文件編譯為pyc文件了。(假設在windows環境下)
import py_compile
py_compile.compile(r'H:\game\test.py')
compile函數原型:
compile(file[, cfile[, dfile[, doraise]]])
file 表示需要編譯的py文件的路徑
cfile 表示編譯後的pyc文件名稱和路徑,默認為直接在file文件名後加c 或者 o,o表示優化的位元組碼
from:http://www.cnblogs.com/dkblog/archive/2009/04/16/1980757.html
E. 如何編譯Python程序生成.pyc文件
pyc文件就是 py程序編譯後得到的位元組碼文件 (py->pyc),python為了提高運行效率也會進行編譯,有時候編譯出pyc文件後,刪除py文件也不會出錯助於pyc文件的產生,給樓主舉例加入你有一個邏輯文件abcd.py,裡面有很多函數A,B,C,D,這個時候,如果你有一個test腳本去導入了abcd.py,只要你運行test腳本,在adcd.py目錄下就會生成一個abcd.pyc文件,而不管你是否需要調用A,B,C,D函數
F. 怎樣將寫好的.py文件生成exe可執行文件
python製作exe可執行文件的方法---使用pyinstallerpython生成windows下exe
格式的可執行程序有三種可選方案:py2exe是大家所熟知的,今天要介紹pyinstaller,這個工具全平台可用。我曾使用python製作一個工
具程序供公司同事使用後,由於公司使用maclinuxwindows都有很多,就使用過它來將程序做成可執行文件,兼容性好,只是會使得程序在
linux平台和mac平台啟動較慢(windows還是比較快的),但基本夠用。安裝完pyinstaller之後就可以開始了。1.使用
pyinstaller生成可執行文件的方法1.1將依賴文件集中到一個文件夾:pyinstaller-D-wmain.py#把main.py替換成
你的主入口python文件即可。-w參數代表main.py是一個窗體程序。1.2將所有依賴文件都打包到同一個可執行文件
中:pyinstaller-F-wmain.py2.調查pyinstaller生成程序的載入過程使用如下命令,可以得到運行時的跟
蹤,tracing,loader的載入過程。pyinstaller-Fwdaui.py#把aui.py換成你需要偵測的文件即可。
G. Python 3.5環境下,已經成功編譯運行了一個.py文件,但是加入運行得到的ip後,沒有跳轉
你的代碼裡面有錯誤。 IpList = ['138.66.213.22,'182.92.103.85','127.0.0.1']改成如下: IpList = ['138.66.213.22','182.92.103.85','127.0.0.1']
H. python如何編譯生成二進制文件
1、可以
2、當你編輯運行py文件後,就會生成對應文件名的pyc文件。
3、pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,載入的速度有所提高,而且pyc是一種跨平台的位元組碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的。
總之,是可以的
I. python程序文件test.py編譯後的文件名
python編譯可執行文件的擴展名
python程序的擴展名有.py、.pyc、.pyo和.pyd。.py是源文件,.pyc是源文件編譯後的文件,.pyo是源文件優化編譯後的文件,.pyd是其他語言寫的python庫。 擴展名 在寫Python程序時我們常見的擴展名是py, pyc,其實還有其他幾種擴展名。下面是幾種擴展名的用法。 py:py就是最基本的源碼擴展名。windows下直接雙擊運行會調用python.exe執行。 pyw:pyw是另一種源碼擴展名,跟py唯一的區別是在windows下雙擊pyw擴展名的源碼會調用pythonw.exe執行源碼,這種執行方式不會有命令行窗口。主要用於GUI程序發布時不需要看到控制台信息的情況。 pyc:在執行python代碼時經常會看到同目錄下自動生成同名的pyc文件。這是python源碼編譯後的位元組碼,一般會在代碼執行時自動生成你代碼中引用的py文件的pyc文件。這個文件可以直接執行,用文本編輯器打開也看不到源碼。 pyo:pyo是跟pyc類似的優化編碼後的文件。 pyd:pyd並非從python程序生成,而是其他語言寫成的可以被python調用的擴展。
J. 如何編譯Python程序生成.pyc文件
pyc文件就是
py程序編譯後得到的位元組碼文件
(py->pyc),python為了提高運行效率也會進行編譯,有時候編譯出pyc文件後,刪除py文件也不會出錯助於pyc文件的產生,給樓主舉例加入你有一個邏輯文件abcd.py,裡面有很多函數A,B,C,D,這個時候,如果你有一個test腳本去導入了abcd.py,只要你運行test腳本,在adcd.py目錄下就會生成一個abcd.pyc文件,而不管你是否需要調用A,B,C,D函數
