2016-06-30 21 views
0

我遇到了這個問題,並找出解決方案。但是,我不明白爲什麼它的行爲如此。python命令行參數必須用引號包裝?

假設我有一個script1.py來運行,它需要來自命令行,路徑和日期的兩個輸入。對於/ root/x/y *,有兩個文件夾,即/ root/x/y1 /和/ root/x/y2 /。在這兩個文件夾下,有一個文件夾20160621.

該腳本如下所示。

if __name__ == "__main__": 

    start_time = time.time() 
    print sys.argv[1], sys.argv[2] 
    main(expPath = sys.argv[1], expDate = sys.argv[2]) 

如果我通過

python script1.py /root/x/y*/ 20160621 

調用腳本我期望得到的

/root/x/y*/ 20160621 

打印但是,有時候,我越來越

/root/x/y1/ /root/x/y2/ 

如果我通過引用這兩個參數來調用腳本,它的工作原理是a預計。

python script1.py '/root/x/y*/' '20160621' 

有什麼特別的理由或解釋這種差異?

回答

1

這不是Python問題。這是關於命令行的問題。

當您在命令行上傳遞/root/x/y*/時,您不是逐字地傳遞該參數。你正在使用一種叫做「globbing」的東西。在將它傳遞給腳本之前,命令行自動擴展到'/root/x/y1/' '/root/x/y2/'。當你把它們放在引號中時,你傳遞的是文本文本,並且不允許命令行來遍歷文本,所以它的行爲就像你期望的那樣。

我會建議您允許命令行在可行的情況下處理globbing。許多shell具有相當先進的globbing能力,最終用戶將依靠這種能力將文件名傳遞給腳本。