2016-04-19 8 views
3

私はargparseでいくつかのオプションを解析しようとしています。私はいくつかの同様の問題が議論発見し、私は例えば、指定できるようにしたいPython argparse - オプションを指定してオプションを指定する

Options with Options with Python argparse?にオーウェンによって与えられた賢明な解決策と同様の問題だと思ったものを発見した:

script.py infile --line <path to file1> beglab='str1' endlab='str2' 
       --line <path to file2> 
       --line <path to file3> beglab='str3' 
       outfile 

--line複数回指定することができます。当初、私はラインオプションのための余分な引数を持っていないし、私が使用して問題なくファイルのリストを作成することができました:

parser.add_argument("--line", action='append') 

今、私はラインで行くためにラベルを追加、オプションする必要があります。上記のように、与えられた行には0,1,2のラベルが関連付けられています。

parser.add_argument("--line", action='append', nargs="+") 

をと実行します:

script.py infile --line somefile beglab='A' endlab='B' 
       --line otherfile beglab='a' endlab='b' outfile 

または

script.py infile --line somefile outfile 

は、私はというエラーを取得し、私は提供されたリンクの例は、私がしようと残念なことにとき、適切なように見えたと感じたのはこのためです議論があまりにも少ない。コマンドから--lineオプションを削除してもポジションのオプションがある場合は動作しますので、必要なものは見逃していません。だから私は行って、nargsオプションを読んだ。 --lineが指定されていれば、少なくともファイル名を持つ必要があります。したがって、 nargs='+'が適切なオプションだと思っています。それはヘルプ [--line LINE [LINE ...]]で正しく表示されるので、このエラーがどこから来たのか本当に混乱しています。

これに対処する代替方法を検討してうれしく思います。私はこのような入力を提供し、それらを使って辞書を作成するという単純さが好きです。

+0

' '+' 'は貪欲で、すべての文字列を' --line'(最後または次の '--'まで)に割り当てます。したがって、 'outfile'には何も残されません。次のポジションの値を予約しようとしたバグ/問題がありますが、すぐには変更されません。これは他のSOの質問でもカバーされています。しかし、受け入れられた答えは良いです。 – hpaulj

答えて

2

構築したいパーサーはあいまいです。 endlab='b'がオプションの場合、arg300はoutfile--lineのパラメータであるか、または位置引数であることをオペレータが意図しているかどうかを判断できません。

あなたのパーサを変更する必要はありませんが、あなたはあなたのコマンドラインを変更する必要があります:

試してみてください。

script.py infile outfile 
      --line somefile beglab='A' endlab='B' 
      --line otherfile beglab='a' endlab='b' 

または:

script.py infile 
      --line somefile beglab='A' endlab='B' 
      --line otherfile beglab='a' endlab='b' 
      -- 
      outfile 
+0

私はいつ私の質問でそれをいつ止めるべきかを知っていました。答えはそうではなく、実際にはエラーメッセージを説明しています!そんな簡単なこと。 – emmalg

+0

私はちょうどあなたの最初の例は、削除する必要がある最後に余分な "outfile"があることに気づいた。 – emmalg

+0

ありがとう、@emmalg。私はそれを削除しました。 –

0

私はargparseでこれを実現する方法についてはよく分からないが、簡単のために、私のような何かを行うことを検討します:いずれかのコードまたはargparseのカスタム型を使用して、引数を解析し、その後

--line <path_to_file>,<beglab>,<endlab>

そして、機能性。あなたは、カスタムタイプの関数のようにdictを返すことができます{'filepath':'<path_to_file>', 'beglab':'<beglab>', 'endlab':'<endlab>'}

関連する問題