2016-05-28 6 views
2

私は2つの引数(パス)をとり、オプションとして-lを使用してログをログファイルに保存できるようにしています。argparse:フラグと変数としてのオプションの引数

私は​​を使用し、次の引数を作成しています:

  1. prog.py path_1 path_2

    parser.add_argument('-l', '--logfile', 
            nargs='?', 
            const='tranfer.log', 
            default=False, 
            help='save log of the transfer') 
    

    これらは、使用の形態です。特にない。

  2. prog.py -l filename path_1 path_2。ログをfilenameファイルに保存します。
  3. prog.py -l path_1 path_2。デフォルトでログファイルを保存します(たとえば、logfile)。

prog.pyがログファイルのファイル名としてpath_1を取るため、項目3に問題があります。この問題は、行の最後に簡単に固定された-lオプションでした。

prog.py path_1 path_2 -l

しかし、私はプログラムを使用するだけではないだろうので、パスファイルとして最後の二つのオプションを使用する​​を伝えるの方法があります場合、私は思っていました。次のように

パスの引数が追加された:

parser.add_argument('left_path', 
        action='store', 
        help='first path') 
parser.add_argument('right_path', 
        action='store', 
        help='second path') 
+2

'prog.py -l - path_1 path_2'を使うことができます。' --'は現在のパーサーを変更せずにオプション処理の終了を知らせます。 – chepner

答えて

2

あなたの評価は正しいと、

prog.py -l path_1 path_2 

は、最初の位置にlpath_2path_1を割り当て、第二の位置の欠落に関するエラーが発生します。

http://bugs.python.org/issue9338argparse optionals with nargs='?', '*' or '+' can't be followed by positionalsこれを処理するバグ/問題です。パッチは提案されていますが、実装されていません。それは自明ではない。 -lを渡すとき、パーサは、ポジションを満たすために必要な引数の数を確認し、次の文字列を消費しないようにする必要があります(あなたの定義ではそうする権利があります)。

以前のSOの質問でも議論されています。あなたは、オプションの最後を置く、または引数(--またはオプションのフラグを立てその他)のリストの終了を知らせるいくつかの他の手段を使用するか必要があり

https://stackoverflow.com/a/29853186/901925

https://stackoverflow.com/a/26986546/901925

。または、-l?(または同等のもの)ではないように引数の定義を変更するか、ポジションをフラグに変更します。

+0

はい、引数を ''? ''からo' 1'に変更する必要があります。バグが修正されたら、コードを変更します。 ありがとう! – nikolat328

0

これを行うにはきちんとした方法があまりにも両方のパスを引数にオプションフラグを導入することであろう。そして、そこにはあいまいさもないだろうとあなたは言うことができるだろう:

prog.py -l -leftpath path_1 -rightpath path_2 
0

あなたは、単一の引数のすべてのオプションを保存し、

parser.add_argument('-p', dest='path', nargs='?', 
        default=('path1/','path2/')) 
args = parser.parse_args() 
if len(args.path) == 3: 
    args.logfile = args.path[0] 
    args.path = args.path[1:] 
elif len(args.path) == 2: 
    args.logfile = '' 
else: 
    print 'Error' 

のように、手で確認することができますが、あなたが持っていますパスをデフォルトと異なるように設定する場合は、-pフラグを設定してください。

関連する問題