在執(zhí)行mnist_softmax.py
文件時,實際運行的是最下方的這一段代碼:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--data_dir', type=str, default='inputdata',
help='Directory for storing input data')
FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
下面分別對此段代碼進行解析
1 關(guān)于__main__
這里使用了Python程序中常用的一個技巧。即使用if __name__ == '__main__':
來使得該程序既可以獨立運行,又可以作為模塊被其它程序?qū)搿?/p>
python中
if __name__ == '__main__':
的解析 鏈接當(dāng)你打開一個
.py
文件時,經(jīng)常會在代碼的最下面看到if __name__ == '__main__':
,現(xiàn)在就來介 紹一下它的作用.
python中每個.py
文件是一個模塊,也是一個對象,并且所有的模塊都有一個內(nèi)置屬性__name__
。一個模塊的__name__
的值取決于您如何應(yīng)用模塊。
如果
import
一個模塊,那么模塊__name__
的值通常為模塊文件名(不帶路徑或者文件擴展名)。但是您也可以像一個標(biāo)準(zhǔn)的程序樣直接運行模塊,在這 種情況下,
__name__
的值將是一個特別缺省"__main__"
。
簡言之:
- 在cmd或者spyder 中直接運行
mnist_softmax.py
文件,則__name__
的值是'__main__'
; - 而在其它代碼中使用
import mnist_softmax
來導(dǎo)入該文件(模塊), 則__name__
的值就是'mnist_softmax'
了. - 用
if __name__ == '__main__'
來判斷是否是在直接運行該.py
文件。
2 關(guān)于parser
代碼中這兩行給此程序增加了處理命令行參數(shù)的功能,是用來處理程序的輸入?yún)?shù)的。
parser = argparse.ArgumentParser()
parser.add_argument('--data_dir', type=str, default='inputdata',
help='Directory for storing input data')
即:在Anaconda命令行或者系統(tǒng)的cmd中運行該程序時,可以加上目錄參數(shù)--data-dir= '目錄名稱'
用以指定數(shù)據(jù)的存放目錄。運行時也可以不加該參數(shù),這樣該參數(shù)就取默認值default='inputdata'
而代碼中下一行
FLAGS, unparsed = parser.parse_known_args()
是將得到的參數(shù)賦值給 FLAGS。經(jīng)過這個語句 FLAG.data_dir 中就存放了目錄的參數(shù)。
舉例說明:如果cmd中運行
python mnist_softmax.py --data-dir="Data"
則FLAGS.data_dir = 'Data' 。該程序會在當(dāng)前目錄下的“Data”文件夾下尋找MNIST數(shù)據(jù)文件。
當(dāng)然如果不加參數(shù)的運行,也可以。即如果cmd中運行
python mnist_softmax.py
則程序就使用默認值default='inputdata'
。FLAGS.data_dir = 'inputdata'
3 關(guān)于 tf.app.run
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
此段代碼不需要知道太多。只要知道,這個就是用來調(diào)用并運行代碼中定義的main函數(shù)def main(_):
的。