2014-01-12 32 views
0

我在使用Python v2.7的​​模塊時遇到了一些麻煩。 基本上,我擁有的是與5個強制變量工作的腳本:argparse - 使用特定參數重現「--help」參數的行爲

  1. 網址
  2. 方法
  3. 登錄
  4. 密碼
  5. 輸出

語法的例子看起來像這樣:

script.py -w/- url [URL] -m/- 方法[METHOD] -l/- login [LOGIN] -p/- password [PASSWORD] -o/- output [OUTPUT ]

我想要做的是這樣的:

  • 添加一個可選的參數-t/--test
  • 其行爲將是,基於與-w/--url參數中使用URL,它會繞過完全是-m/--method,-l/--login-p/--password的論點,但它的工作,我需要告訴​​停止處理參數,如果提供-t/--test(但僅限於-w/--url)。

這種行爲甚至可能嗎?我試圖玩​​子命令,但它似乎(至少對我的小知識)有點矯枉過正。

注:這是我原來的代碼:

# Description : parses script arguments 
# Argument(s) : all 
# Return value : all arguments values 
def testArgs(): 
    parser = argparse.ArgumentParser(description='Foo', formatter_class=argparse.RawDescriptionHelpFormatter) 
    parser.add_argument('-w','--url', help='URL', required=True) 
    parser.add_argument('-t','--test', help='Test command', action='store_true') 
    parser.add_argument('-m','--method', help='METHOD', required=True) 
    parser.add_argument('-u','--login_name', help='LOGIN', required=True) 
    parser.add_argument('-p','--login_password', help='PASSWORD', required=True) 
    parser.add_argument('-o','--output_format', help='OUTPUT', required=True, choices=['json', 'yaml', 'python'], default='json') 
    args = parser.parse_args() 
    return args 

編輯:大量的測試後,我所管理的以下內容:

def testArgs(): 
    parser = argparse.ArgumentParser(description='DESCRIPTION') 
    subparsers = parser.add_subparsers() 
    p_list = subparsers.add_parser('test', help='List all available methods') 
    p_list.add_argument('-w', help='URL', required=True) 
    p_list.add_argument('-t', help='Test', action='store_true', required=True) 
    p_cmd = subparsers.add_parser('cmd', help='Executes command') 
    p_cmd.add_argument('-w', help='URL', required=True) 
    p_cmd.add_argument('-m', help='Method', required=True) 
    p_cmd.add_argument('-l', help='Login', required=True) 
    p_cmd.add_argument('-p', help='Password', required=True) 
    p_cmd.add_argument('-o', help='Output', required=True) 
    args = parser.parse_args() 
    return args 

表現出以下行爲:

$ python testArgparse.py -h 
usage: testArgeparse.py [-h] {test,cmd} ... 

DESCRIPTION 

positional arguments: 
    {test,cmd} 
    test  Lists all available methods 
    cmd  Executes command 

optional arguments: 
    -h, --help show this help message and exit 

但對別人的論點訪問幫助,我需要做到以下幾點:

$ python testArgparse.py test -h 
usage: testArgparse.py test [-h] -w W -t 

optional arguments: 
    -h, --help show this help message and exit 
    -w W  URL 
    -t   Test 


$ python testArgparse.py cmd -h 
usage: testArgparse.py cmd [-h] -w W -m M -l L -p P -o O 

optional arguments: 
    -h, --help show this help message and exit 
    -w W  URL 
    -m M  Method 
    -l L  Login 
    -p P  Password 
    -o O  Output 

我想是可以的,至少,所有參數的顯示幫助,而不必使用--help兩個testcmd的論點。

理想情況下,我想是這樣的行爲:

$ python testArgparse.py [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT] 
+2

當你看到''-t/- test''時,忽略其他參數 –

+0

向第一條評論添加了原始代碼。 – iceman94

+0

您應該簽出[互斥組合](http://docs.python.org/dev/library/argparse.html#mutual-exclusion)。你可以讓一個參數或另一個參數是必需的,但不能同時存在。不過,您可能必須做一些技巧才能擁有1 *或* 3組。 – SethMMorton

回答

1

required=Truestore_true沒有意義。默認值是False,但如果需要,返回值將始終爲True

由於無條件只需要-w,所以我會放棄required參數。然後在parse_args之後測試所需的值。我仍然可以在當時的使用情況下發出​​錯誤。換句話說,做我自己的測試,而不是嘗試一些幻想中的argparse。

def testArgs(): 
    usage = '[-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT]' 
    parser = argparse.ArgumentParser(description='DESCRIPTION',usage=usage) 
    parser.add_argument('-w', help='URL', required=True) 
    parser.add_argument('-t', help='Test', action='store_true') 
    parser.add_argument('-m', help='Method') 
    parser.add_argument('-l', help='Login') 
    parser.add_argument('-p', help='Password') 
    parser.add_argument('-o', help='Output') 
    args = parser.parse_args() 

    # sample test, streamline and refine to suit your needs 
    # this assumes the default for all these args is None 
    if not args.t: # '-t' in in argv 
     if any([args.m is None, args.l is None, args.p is None, args.o is None]): 
      parser.error('m,l,p,o are all required') 
    return args 

1216:~/mypy$ python2.7 stack21070971.py 
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT] 
stack21070971.py: error: argument -w is required 

1213:~/mypy$ python2.7 stack21070971.py -w url 
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT] 
stack21070971.py: error: m,l,p,o are all required 

1213:~/mypy$ python2.7 stack21070971.py -w url -t 
Namespace(l=None, m=None, o=None, p=None, t=True, w='url') 

1214:~/mypy$ python2.7 stack21070971.py -w url -m mmm 
usage: [-w URL -t] | [-w URL -m METHOD -u LOGIN -p PASS -o OUTPUT] 
stack21070971.py: error: m,l,p,o are all required 
... 

1215:~/mypy$ python2.7 stack21070971.py -w url -m mmm -l uuu -p ppp -o ooo 
Namespace(l='uuu', m='mmm', o='ooo', p='ppp', t=False, w='url') 
+0

再次感謝hpaulj。 我最終使用了你的建議並測試了args的內容。 有人告訴我停止使用'sys.argv'來檢查參數並使用'argparse',但似乎仍然有一些情況需要解決該問題。 – iceman94