摘要:最近在看的官方文檔,提到一個的用法,很是不理解,所以查找了很多文檔,并進(jìn)行了如下總結(jié)。的用途定位并執(zhí)行該模塊。可讀取包內(nèi)任何文件內(nèi)容。如果沒有,則從查找,找到后載入內(nèi)存,并加入到字典,名稱也將導(dǎo)入到當(dāng)前模塊的命名空間。
最近在看 __main__ 的官方文檔 —— https://docs.python.org/3/library/__main__.html#module-__main__,提到一個 python -m 的用法,很是不理解,所以查找了很多文檔,并進(jìn)行了如下總結(jié)。查看 Python 的 help 內(nèi)容
$ python --help ... -m mod : run library module as a script (terminates option list) # 直譯就是按照腳本的方式執(zhí)行模塊 ...有無 -m 參數(shù)的比較
1. python script.py # 直接執(zhí)行腳本 2. python -m script.py # 當(dāng)做模塊的方式執(zhí)行,相當(dāng)于 import
一般情況下,我們會想當(dāng)然的認(rèn)為,有無參數(shù) -m 對程序會有不同的影響,但是很可惜,第二種寫法是會在程序執(zhí)行之后報錯的。其正確的寫法是:丟掉 .py 后綴。
首先直觀的觀察執(zhí)行結(jié)果,Python 的版本是 3.6.3。
編寫 script.py 腳本,內(nèi)容如下:
import sys print(sys.path) print(sys.modules)
直接執(zhí)行腳本
$ python script.py ["/home/ossifrage/workspaces/python-m", "/usr/lib/python36.zip", "/usr/lib/python3.6", ...] {..., "__main__":, ...}
當(dāng)做模塊方式執(zhí)行
$ python -m script ["", "/usr/lib/python36.zip", "/usr/lib/python3.6", ...] {..., "__main__":, ..., "runpy": , "pkgutil": }
顯示的內(nèi)容還有很多,只突出顯示出了不同的地方。
通過比較不同的地方,我們發(fā)現(xiàn):
第一種方法——直接運行腳本,當(dāng)前腳本所在的路徑會加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路徑不是絕對路徑,只是腳本名稱。
第二種方法——當(dāng)做模塊方式運行,當(dāng)前腳本所在的路徑不會加入到 sys.path 列表中,但是 sys.modules 字典中的 __main__ 的路徑是絕對路徑,同時,還引入了 runpy 和 pkgutil 兩個模塊。
runpy 的用途:定位并執(zhí)行該模塊。主要用途在于實現(xiàn)命令行 -m 執(zhí)行 python 模塊的效果。
pkgutil 的用途:獲取包里面的所有模塊列表。pkgutil.get_data() 可讀取包內(nèi)任何文件內(nèi)容。
模塊的導(dǎo)入機制其實,上面的內(nèi)容涉及到了 Python 包模塊的導(dǎo)入機制。
要理解模塊的導(dǎo)入機制,得理解幾個關(guān)鍵的名詞。sys.path -> sys.modules -> < module >.__dict__。
sys.path:是一個列表。保存著模塊的搜索路徑。如果路徑?jīng)]有存在與該列表中,可使用 sys.path.append() 導(dǎo)入。
sys.modules: 是一個字典。所有加載到內(nèi)存中的模塊都存放在該字典中。當(dāng) import 一個模塊的時候,首先會在這個字典中查找是否已經(jīng)加載了目標(biāo)模塊。如果已加載,則將模塊的名字加入到正在調(diào)用 import 的模塊的 Local 命名空間(也就是< module >.__dict__)中。如果沒有,則從 sys.path 查找,找到后載入內(nèi)存,并加入到 sys.modules 字典,名稱也將導(dǎo)入到當(dāng)前模塊的 Local 命名空間。
reference[[python]自問自答:python -m參數(shù)?](https://www.cnblogs.com/xuewe...
Python的-m參數(shù)
python中的import(涉及pkgutil和inspect包)
import 迷宮
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41157.html
摘要:網(wǎng)上還查到一個方法是通過配置反向代理,我試了一個多小時然后放棄了。配置好反向代理之后,當(dāng)用戶訪問頁面時,服務(wù)器收到請求,將其轉(zhuǎn)換為交給處理,并將處理出的結(jié)果返回,這樣用戶就看到了正確的頁面。 最近開始學(xué)著用Python+Tornado+MongoDB寫網(wǎng)站,興起寫了一個博客,覺得很有意思所以想掛在服務(wù)器上發(fā)布出去找大家一起玩。這個時候就遇到了問題。 服務(wù)器是windows系統(tǒng),安裝的...
摘要:系統(tǒng)安裝部署環(huán)境教程第一安裝依賴環(huán)境在準(zhǔn)備安裝框架部署之前,我們需要先安裝依賴環(huán)境,因為可能默認(rèn)的環(huán)境沒有完善的最新部署包。檢查最新版本的數(shù)據(jù)庫,然后部署安裝。到目前為止,我們已經(jīng)成功的在環(huán)境中部署了應(yīng)用程序,以及。 Django,是一款針對Python環(huán)境的WEB開發(fā)框架,能夠幫助我們構(gòu)架快捷、簡單的WEB框架設(shè)置,Django框架非常適合開發(fā)內(nèi)容應(yīng)用環(huán)境,所以在本文中,麥子將整理基...
摘要:站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻,楊老師的站主頁在此主頁有一系列的學(xué)習(xí)視頻,推薦干貨用于部署的項目主要用了提供后臺,所以靜態(tài)文件僅有部分的。接下來是部署和激活階段了。 吐吐槽 此篇blog將詳細(xì)記錄部署Django的每一個步驟,網(wǎng)上現(xiàn)有的教程實在太少太老了!好多坑!第一次嘗試后臺很懵,最坑的地方是安裝的wsgi部分模塊需要更新。B站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻...
摘要:站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻,楊老師的站主頁在此主頁有一系列的學(xué)習(xí)視頻,推薦干貨用于部署的項目主要用了提供后臺,所以靜態(tài)文件僅有部分的。接下來是部署和激活階段了。 吐吐槽 此篇blog將詳細(xì)記錄部署Django的每一個步驟,網(wǎng)上現(xiàn)有的教程實在太少太老了!好多坑!第一次嘗試后臺很懵,最坑的地方是安裝的wsgi部分模塊需要更新。B站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻...
摘要:站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻,楊老師的站主頁在此主頁有一系列的學(xué)習(xí)視頻,推薦干貨用于部署的項目主要用了提供后臺,所以靜態(tài)文件僅有部分的。接下來是部署和激活階段了。 吐吐槽 此篇blog將詳細(xì)記錄部署Django的每一個步驟,網(wǎng)上現(xiàn)有的教程實在太少太老了!好多坑!第一次嘗試后臺很懵,最坑的地方是安裝的wsgi部分模塊需要更新。B站真是個學(xué)習(xí)的地方,竟發(fā)現(xiàn)了楊老師的部署視頻...
閱讀 3505·2021-11-23 10:13
閱讀 873·2021-09-22 16:01
閱讀 918·2021-09-09 09:33
閱讀 643·2021-08-05 09:58
閱讀 1725·2019-08-30 11:14
閱讀 1961·2019-08-30 11:02
閱讀 3274·2019-08-29 16:28
閱讀 1491·2019-08-29 16:09