2016-12-02 64 views
0

我發現argparse在參數前添加了額外的空間。基於下面Python argparse在參數前添加額外空間

def parse_arguments(): 
    parser = argparse.ArgumentParser(
    prog='sample', 
    description='bla bla', 
    parser.add_argument('-s', '--search', dest='pattern', required=True, 
    help='search path pattern (e.g. /dir1/dir2/*.ext)') 

    args = parser.parse_args() 

    if args.pattern[0] == ' ': 
     print "One space is added to the argument" 
    return args 

示例代碼和測試在交互式shell爲:

import sys 
sys.argv = ['', '-s /Users/user/Desktop/test'] 
execfile('test.py') 

提供自變量sys.argv = ['', '-s=/Users/user/Desktop/test']不會引起這樣的加(從https://stackoverflow.com/a/36376287/2101864激勵)。

這是記錄的行爲還是我錯過了什麼?因爲通常用戶提供的參數在參數標記和值之間添加空格。

+0

謝謝@aneroid您的詳細說明。 –

回答

2

如果您直接執行test.py,則不會出現額外空間。這發生在交互式shell中,因爲您在執行test.py之前設置了sys.argv

sys.argv = ['', '-s /Users/user/Desktop/test'] 

但是從終端運行腳本和檢查sys.argv時,你會得到:

['test.py', '-s', '/Users/user/Desktop/test'] 

它從終端上運行時也忽略-s和價值之間的多個空格。

shell/terminal已經爲腳本單獨提供了每個參數(並且Python將它們放入列表中)。所以第二參數只是-s而不是-s /Users/user/Desktop/test在交互式shell中做sys.argv = ['', '-s', '/Users/user/Desktop/test']給出了正確的結果。

什麼argparse 可能不會被掃描每個ARG在sys.argv,查找所有參數名稱模式,-s--search。一旦找到,之後的所有內容都是參數值。 -s=/Users/user/Desktop/test中的=是標準的arg=value表示法(過去更是如此),所以它將它解釋爲參數與其值之間的分隔符。