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