Python模塊的加載講解
不管是用import還是用from mmmm import *的方式導(dǎo)入模塊,當(dāng)程序運行之后,回頭在看那個存儲著mmmm.py文件的目錄中,多了一個文件:
$ ls mmm* mmmm.py mmmm.pyc
在這個目錄下面,除了原來的那個mmmm.py之外,又多了一個mmmm.pyc文件,這個文件不是我寫的,需要用import的過程說起。
import的工作流程
import mmmm,并不是僅僅將mmmm.py這個文件裝載到當(dāng)前位置(文件內(nèi)),其實是首先進行了一次運算。當(dāng)mmmm.py被第一次導(dǎo)入的時候,python首先要對其進行編譯,生成擴展名為.pyc的同名文件,然后才執(zhí)行mmmm模塊的代碼,創(chuàng)建相應(yīng)的對象等。就如同把大象裝進冰箱,有三步要執(zhí)行:
- 搜索。就是python要能夠找到import的模塊。怎么找到,后面講述。
- 編譯。找到模塊文件之后,將其編譯成字節(jié)碼,就是那個.pyc文件里面的(關(guān)于字節(jié)碼,下面會介紹,請繼續(xù)閱讀)。注意,不是什么時候都編譯的,只有第一次運行時候才編譯,如果mmmm.py文件改變了,相當(dāng)于又一個新文件,也會從新編譯。其實就是.pyc文件中有一個時間戳,python會自動檢查這個時間戳,如果它比同名的.py文件時間戳舊,就會從新編譯。否則跳過。當(dāng)然,如果根本就沒有找到同名的.py源文件,只有字節(jié)碼文件.pyc,那么就只能運行這個了。
- 運行。執(zhí)行就是前面已經(jīng)編譯的模塊字節(jié)碼文件,順理成章要執(zhí)行了。
搜索模塊
一般情況下,python會自動的完成模塊搜索過程。但是,在某些情況下,或許會要求程序員來設(shè)定搜索路徑。當(dāng)import一個模塊后,python會按照下面的順序來找那個將要導(dǎo)入的模塊文件
- 程序的主目錄。上一講中,在codes這個目錄中運行交互模式,這時候的主目錄就是codes,當(dāng)在那個交互模式中運行import mmmm的時候,就首先在codes這個目錄中搜索相應(yīng)的文件(找到.py之后編譯成為.pyc)。當(dāng)然,后面在網(wǎng)頁編程中,所謂主目錄是可以通過頂層文件設(shè)置的目錄。
- PYTHONPATH目錄。這是一個環(huán)境變量設(shè)置,如果沒有設(shè)置則濾去。如何進行環(huán)境變量設(shè)置,請google啦。
- 標(biāo)準(zhǔn)庫目錄。已經(jīng)隨著Python的安裝進入到計算機中的那個。
- 任何.pth文件的內(nèi)容。如果有這類文件,最后要在這類文件中搜索一下。這是一個簡單的方法,在.pth文件中,加入有效目錄,使之成為搜索路徑。下圖就是我的計算機上,存放.pth文件的位置以及里面放著的.pth文件
也可以自己編寫.pth文件,里面是有關(guān)搜索目錄,保存到這里。比如,打開目錄中的easy-install.pth文件,發(fā)現(xiàn)的內(nèi)容:
搜索就是這么一個過程。這里建議了解即可,不一定非要進行什么設(shè)置,在很多情況下,python都是會自動完成的。特別是初學(xué)者,暫且不要輕舉妄動。
重載模塊
以mmmm模塊為例。
在一個shell里面,運行了python,并且做了如下操作:
>>> import mmmm >>> mmmm.web 'https://hiekay.github.io'
下面我再打開一個shell,編輯mmmm.py這個文件,對web值進行適當(dāng)修改:
#!/usr/bin/env python #coding:utf-8 web = "https://hiekay.github.io, I am writing a python book on line. " def my_name(name): print name class pythoner: def __init__(self,lang): self.lang = lang def programmer(self): print "python programmer language is: ",self.lang
保存之后,切換到原來的那個導(dǎo)入了模塊的交互模式:
>>> mmmm.web 'https://hiekay.github.io'
輸出的跟前面的一樣,沒有任何變化,這是為什么呢?
原來,當(dāng)導(dǎo)入模塊的時候,只會在第一次導(dǎo)入時加載和執(zhí)行模塊代碼,之后就不會重新加載或重新執(zhí)行了,如果模塊代碼修改了,但是這里執(zhí)行的還是修改之前的。
怎么實現(xiàn)代碼修改之后,執(zhí)行新的呢?一種方式就是退出原來的交互模式,再重新進入,再import mmmm。這種方法有點麻煩。Python提供了另外一個函數(shù)——reload函數(shù),能夠?qū)崿F(xiàn)模塊的重新加載(簡稱重載),重載后模塊代碼重新執(zhí)行。如下繼續(xù):
>>> reload(mmmm) <module 'mmmm' from 'mmmm.py'> >>> mmmm.web 'https://hiekay.github.io, I am writing a python book on line. '
這下就顯示修改之后的內(nèi)容了。
特別提醒注意:
- reload是內(nèi)置函數(shù)
- reload(module),module是一個已經(jīng)存在的模塊,不是變量名。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Python爬蟲實戰(zhàn):分析《戰(zhàn)狼2》豆瓣影評
這篇文章主要介紹了Python爬蟲實戰(zhàn):《戰(zhàn)狼2》豆瓣影評分析,小編在這里使用的是python版本3.5,需要的朋友可以參考下2018-03-03Python數(shù)學(xué)形態(tài)學(xué)實例分析
這篇文章主要介紹了Python數(shù)學(xué)形態(tài)學(xué),結(jié)合實例形式分析了Python數(shù)學(xué)運算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Python使用keys() 獲取 Redis 數(shù)據(jù)庫中的所有鍵
哈希、列表、集合、排序集合、字符串、JSON 和流是 Redis 支持的眾多數(shù)據(jù)結(jié)構(gòu)之一,本文將討論獲取 Redis 數(shù)據(jù)庫中的所有鍵,感興趣的朋友跟隨小編一起看看吧2023-08-08Python按條件篩選、剔除表格數(shù)據(jù)并繪制剔除前后的直方圖(示例代碼)
本文介紹基于Python語言,讀取Excel表格文件數(shù)據(jù),以其中某一列數(shù)據(jù)的值為標(biāo)準(zhǔn),對于這一列數(shù)據(jù)處于指定范圍的所有行,再用其他幾列數(shù)據(jù)的數(shù)值,加以數(shù)據(jù)篩選與剔除,感興趣的朋友跟隨小編一起看看吧2024-07-07Python 更快進行探索性數(shù)據(jù)分析的四個方法
今天我給大家分享幾種更快的探索性數(shù)據(jù)分析方法,它們可以進一步加速 EDA。 我們以一個學(xué)生考試成績的例子,創(chuàng)建一個如下所示的 DataFrame 并繼續(xù)操作。歡迎收藏學(xué)習(xí),喜歡點贊支持2021-11-11