轉(zhuǎn)自:https://blog.csdn.net/yjk13703623757/article/details/77918633/
對(duì)內(nèi)容進(jìn)行了部分篩選
1. 摘要
通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中现拒,你是小明(__name__ == '小明')辣垒;在你自己眼中,你是你自己(__name__ == '__main__')印蔬。
if __name__ == '__main__'的意思是:當(dāng).py文件被直接運(yùn)行時(shí)勋桶,if __name__ == '__main__'之下的代碼塊將被運(yùn)行;當(dāng).py文件以模塊形式被導(dǎo)入時(shí)侥猬,if __name__ == '__main__'之下的代碼塊不被運(yùn)行例驹。
(一個(gè)python的文件有兩種使用的方法,第一是直接作為腳本執(zhí)行退唠,第二是import到其他的python腳本中被調(diào)用(模塊重用)執(zhí)行坡椒。因此if __name__ == 'main': 的作用就是控制這兩種情況執(zhí)行代碼的過(guò)程躏尉,在if __name__ == 'main': 下的代碼只有在第一種情況下(即文件作為腳本直接執(zhí)行)才會(huì)被執(zhí)行柒桑,而import到其他腳本中是不會(huì)被執(zhí)行的。)
2. 程序入口
對(duì)于很多編程語(yǔ)言來(lái)說(shuō)仅政,程序都必須要有一個(gè)入口,比如C盆驹,C++圆丹,以及完全面向?qū)ο蟮木幊陶Z(yǔ)言Java,C#等躯喇。如果你接觸過(guò)這些語(yǔ)言辫封,對(duì)于程序入口這個(gè)概念應(yīng)該很好理解,C廉丽,C++都需要有一個(gè)main函數(shù)作為程序的入口倦微,也就是程序的運(yùn)行會(huì)從main函數(shù)開(kāi)始。同樣雅倒,Java璃诀,C#必須要有一個(gè)包含Main方法的主類弧可,作為程序入口蔑匣。
而Python則不同,它屬于腳本語(yǔ)言棕诵,不像編譯型語(yǔ)言那樣先將程序編譯成二進(jìn)制再運(yùn)行裁良,而是動(dòng)態(tài)的逐行解釋運(yùn)行。也就是從腳本第一行開(kāi)始運(yùn)行校套,沒(méi)有統(tǒng)一的入口价脾。
一個(gè)Python源碼文件(.py)除了可以被直接運(yùn)行外,還可以作為模塊(也就是庫(kù))笛匙,被其他.py文件導(dǎo)入侨把。不管是直接運(yùn)行還是被導(dǎo)入,.py文件的最頂層代碼都會(huì)被運(yùn)行(Python用縮進(jìn)來(lái)區(qū)分代碼層次)妹孙,而當(dāng)一個(gè).py文件作為模塊被導(dǎo)入時(shí)秋柄,我們可能不希望一部分代碼被運(yùn)行。
3.?__name__是什么
3.1?__name__反映一個(gè)包的結(jié)構(gòu)
(什么是包蠢正?)
__name__是內(nèi)置變量骇笔,可用于反映一個(gè)包的結(jié)構(gòu)。假設(shè)我們有一個(gè)包a嚣崭,包的結(jié)構(gòu)如下:
3.2?__name__表示當(dāng)前模塊的名字
__name__是內(nèi)置變量,可用于表示當(dāng)前模塊的名字芦劣。我們直接運(yùn)行一個(gè).py文件(模塊)
4.?__main__.py文件與python -m
Python的-m參數(shù)用于將一個(gè)模塊或者包作為一個(gè)腳本運(yùn)行,而__main__.py文件相當(dāng)于是一個(gè)包的“入口程序“持寄。
python xxx.py源梭,直接運(yùn)行xxx.py文件
python -m xxx.py废麻,把xxx.py當(dāng)做模塊運(yùn)行
總結(jié)一下
當(dāng)加上-m參數(shù)時(shí)模庐,Python會(huì)把當(dāng)前工作目錄添加到sys.path中;而不加-m時(shí)掂碱,Python則會(huì)把腳本所在目錄添加到sys.path中。
當(dāng)加上-m參數(shù)時(shí)沧卢,Python會(huì)先將模塊或者包導(dǎo)入醉者,然后再執(zhí)行。
__main__.py文件是一個(gè)包或者目錄的入口程序撬即。不管是用python package還是用python -m package運(yùn)行,__main__.py文件總是被執(zhí)行唱歧。
5.其他
調(diào)用模塊時(shí)程序不能放在以下程序下粒竖,否則無(wú)法正常工作
if __name__ == "__main__":
而多進(jìn)程則必須放在下面