2016-06-25 75 views
0

比方說,我有一個輸入文件選項和一個輸出文件選項。我如何創建一個結合這兩者的選項?例如:Argparse快捷選項用於組合其他選項

$ ./my_script.py -i input.txt -o output.txt 

可以進行組合,如:

$ ./my_script.py --io input_output.txt 

你可能會說,我可以做-io這兩個選項結合起來,但-io filename-i -o filename,不-i filename -o filename一條捷徑。

我認爲有可能增加dest=('input', 'output').add_argument()電話,但引發的錯誤是dest必須是一個字符串。

我嘗試添加與--io一側互斥一羣又一羣的-i-o在另一邊,但-i-o幫助文本沒有出現任何更當程序與--help運行:

usage: myscript.py [-h] [--io] [-i INPUT] [-o OUTPUT] 

optional arguments: 
    -h, --help show this help message and exit 
    --io  Use file as both input and output 

此外,互斥部分似乎沒有工作。我仍然可以使用--io和個人-i-o選項來調用腳本,並且不會出現錯誤。

這裏是我的骨架代碼:

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument("-i", "--input", help="Input file") 
parser.add_argument("-o", "--output", help="Output file") 

parser.parse_args() 

與組代碼:

import argparse 

parser = argparse.ArgumentParser() 

exclusive = parser.add_mutually_exclusive_group() 
exclusive.add_argument("--io", help="Input and Output") 

sub = exclusive.add_argument_group() 
sub.add_argument("-i", "--input", help="Input file") 
sub.add_argument("-o", "--output", help="Output file") 

args = parser.parse_args() 

if args.io: 
    in_file = out_file = args.io 
else: 
    in_file = args.input 
    out_file = args.output 

回答

1

這很容易解釋爲什麼事情不起作用而不是提出解決方案。

是的,dest必須是字符串;沒有規定值爲dest的列表或元組。但你的in_file = out_file = args.io地址發佈就好了。您可能也有使用:

args.in_file=args.out_file = args.io 

沒有什麼錯解析後按摩args值。

argument_group不適用於嵌套,也不是爲mutually_exclusive_group添加「任何」(或'和')邏輯的方法。也許在遙遠的將來,將會有一種定義全套邏輯組合的方式,但現在不是。其實做測試並不難;很難定義API和使用格式。

另請注意,mutually_exclusive_group用於格式化參數的co_ocurrance的使用和測試,而argument_group用於對參數幫助行進行分組。兩個非常不同的目的。

如果-istore_true參數,則-io filename將被理解爲-i -o filename。但也翻譯它-i filename -o filename是不是在當前的代碼(並且可能不足以保證一個補丁)。

如果你還是想用-i-o--io(我喜歡-- 2字符標誌)我可以建議兩件事情:

  • 編寫自定義的使用,演示了你想要的。如果很難寫出明確的用法,那麼你的設計可能太複雜了。

  • 做你自己的exclusive groups解析後測試。 args.in_file is None是測試標誌是否已被使用的好方法。另一種可能性是定義默認值,以便您不關心用戶使用哪種組合。

0

保持簡單 - 獨家組代碼,表明使用這兩種形式反正不排除。試試這個:

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument("-i", "--input", help="Input file") 
parser.add_argument("-o", "--output", help="Output file") 
parser.add_argument("--io", help="Input and Output") 

parser.parse_args() 

if args.io: 
    assert args.input is None and args.output is None 
    args.input = args.output = args.io 
else: 
    assert args.input and args.output 
+0

這太糟糕了,沒有更容易的事情。我決定使用與此類似的東西,除了我使用的是比AssertionError更友好的用戶界面。 – zondo

相關問題