Python在什么時候會生成pyc文件呢?
??事情大概是這樣的,之前我一直以為python文件在執行過之后就會生成pyc文件,后來一次偶然情況下,發現還是自己too young too simple,在看過其他大神文章并且自己驗證之后,發現還是有點意思的,權當沒事寫點文章吧。
什么是pyc文件呢???簡單來說,pyc文件就是Python的字節碼文件,我們都知道Python是一種全平臺的解釋性語言,全平臺其實就是Python文件在經過解釋器解釋之后(或者稱為編譯)生成的pyc文件可以在多個平臺下運行,這樣同樣也可以隱藏源代碼。其實,Python是完全面向對象的語言,Python文件在經過解釋器解釋后生成字節碼對象PyCodeObject,pyc文件可以理解為是PyCodeObject對象的持久化保存方式。
什么時候會生成pyc文件呢???pyc文件只有在文件被當成模塊導入時才會生成。也就是說,Python解釋器認為,只有import進行的模塊才需要被重用。 生成pyc文件的好處顯而易見,當我們多次運行程序時,不需要重新對該模塊進行重新的解釋。主文件一般只需要加載一次不會被其他模塊導入,所以一般主文件不會生成pyc文件。
??下面來舉個例子說明,見代碼
文件print_hello.py print("hello")
import print_hello
執行python print_hello.py
E: est>python print_hello.py hello E: est>dir 驅動器 E 中的卷是 文件 卷的序列號是 B612-D1B0 E: est 的目錄 2017/09/25 21:09. 2017/09/25 21:09 .. 2017/09/25 21:08 18 import_hello.py 2017/09/25 21:08 14 print_hello.py 2 個文件 32 字節 2 個目錄 49,367,699,456 可用字節
可以發現并沒有pyc文件生成,
執行python import_hello.py
E: est>python import_hello.py hello E: est>dir 驅動器 E 中的卷是 文件 卷的序列號是 B612-D1B0 E: est 的目錄 2017/09/25 21:12. 2017/09/25 21:12 .. 2017/09/25 21:08 18 import_hello.py 2017/09/25 21:08 14 print_hello.py 2017/09/25 21:12 124 print_hello.pyc 3 個文件 156 字節 2 個目錄 49,367,699,456 可用字節
需要說明兩點的是:
執行python import_hello.py,開始執行import print_hello,導入print_hello模塊,然后執行了print_hello模塊里面的代碼,所以我們可以看到有“hello”輸出;
如果不想執行里面的代碼,一般可以將代碼封裝在一個類或者函數里面,然后加個if判斷,類似下面這樣,表示如果是被導入則不執行if下的代碼,如果作為程序入口或者腳本執行,則執行if下的代碼。
if __name__ == "__main__": print("hello")pyc文件的過期時間
在生成pyc文件的同時,寫入了一個Long型的變量,用于記錄最近修改的時間;
每次載入之前都先檢查一下py文件和pyc文件的最后修改日期,如果不一致則會生成一個新的pyc文件
總結??總的來說,了解pyc其實對于Python開發者來說并沒有多大的意義,本著鉆研的精神寫下這篇文章,感覺有一下幾點可以考慮
Python的pyc文件從一定意義上可以減少解釋器解釋Python文件的時間,不必每次都要解釋編譯一遍,方便下次快速加載,有點類似數據庫的緩存吧;
想想如果我們想設計一個系統,類似主文件這種不會被重用,而其他模塊可能會被重用,我們就需要分開設計對待了吧;
在設計緩存系統時候,類似Python這種對比最后修改時間的方式,是不是可以給我們一點啟示呢?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41007.html
摘要:打包成單文件所使用的命令為打包成文件夾所使用的命令為不管是哪種打包方式都會留下一個文件。這樣我們只需將腳本文件和腳本文件放置到同一文件夾下,運行我們的腳本。可以看到已經完美的反編譯出其中的腳本好了,相信大家已經明白了反編譯的原理。 近期閱讀了一篇很感興趣的文章,為免后續文章被刪無法再閱讀,現...
摘要:找到模塊文件之后,將其編譯成字節碼,就是那個文件里面的關于字節碼,下面會介紹,請繼續閱讀。當然,如果根本就沒有找到同名的源文件,只有字節碼文件,那么就只能運行這個了。執行就是前面已經編譯的模塊字節碼文件,順理成章要執行了。 不管是用import還是用from mmmm import *的方式導入模塊,當程序運行之后,回頭在看那個存儲著mmmm.py文件的目錄中(關于mmmm.py文件可...
摘要:不知道你們是否注意到,通過這個命令安裝庫后,也會自動生成對應的文件。但是通過程序或者顯示安裝已安裝文件就會發現,包中只包含了文件,并沒有包含文件。也就是說,在包安裝時,在腳本執行過程中堆剛安裝的腳本進行了編譯,生成了文件。 問題 使用Ubuntu系統或者其他基于deb包管理器系統的人,經常通過apt-get install命令來安裝Python的庫。不知道你們是否注意到,通過這個命令...
動機 Python進行商業開發時, 需要有一定的安全意識, 為了不被輕易的逆向. 混淆和加密就有所必要了.混淆 為了增加代碼閱讀的難度, 源代碼的混淆非常必要, 一個在線的Python代碼混淆網站. http://pyob.oxyry.com/同時需要注意的是, 這個混淆其實還是被很多人懷疑的, 因為即使混淆了, 也沒有改變代碼的結構. 這種方法只能防君子,不防小人所以, 必要的話, 在編程的時候...
摘要:標準模塊附帶了一個標準模塊庫。它返回一個如果調用不傳遞參數,則列出當前已經定義的所有名字用可以查看所有的內置類型變量函數等,方法是借助標準模塊模塊高級技巧總結的搜索路徑,順序一定要搞得清編譯后的文件內置函數查看模塊定義的名字。 上一節,我們講解了Python模塊的基礎知識,這一節我們繼續深入了解模塊的更多知識,從而讓大家全面了解、掌握和運用模塊到我們實際的編程中。 在上一節中有一句話接...
閱讀 1588·2019-08-30 13:18
閱讀 1578·2019-08-29 12:19
閱讀 2094·2019-08-26 13:57
閱讀 4137·2019-08-26 13:22
閱讀 1179·2019-08-26 10:35
閱讀 2991·2019-08-23 18:09
閱讀 2500·2019-08-23 17:19
閱讀 677·2019-08-23 17:18