18

sshコマンドラインクライアントのラッパーを作成しています。の一部である最初の位置引数の後、それ以降のcommandすべてのオプションも位置引数として扱われる必要があります。

の下optparseで、これはで行われると思いますdisable_interspersed_args

現在、私はこのようなものを持っています:

parser = argparse.ArgumentParser()
parser.add_argument('--parallel', default=False, action='store_true')
# maybe allow no command? this would ssh interactively into each machine...
parser.add_argument('command', nargs='+')
args = parser.parse_args()

ただし、オプションがコマンドの一部として渡された場合(など)、代わりに不明なオプションとしてmy_wrapper ls -l解釈されます。ArgumentParsererror: unrecognized arguments: -l

を使用するparse_known_args()と、オプションが乱れる可能性があります。

p = argparse.ArgumentParser()
p.add_argument('-a', action='store_true')
p.add_argument('command', nargs='+')
print(p.parse_known_args())

$ python3 bah.py -b ls -l -a
(Namespace(a=True, command=['ls']), ['-b', '-l'])

-bここでは、以前のの位置lsが失わ-aれ、コマンドから解析されていることがわかりますが、これは望ましくありません。

どうやって:

  • 特定の時点以降に引数が解析されないようにしますか?
  • 散在する引数の解析を無効にしますか?
  • 接頭辞付きの引数を位置引数として使用できるようにしますか?
4

3 に答える 3

19

私も同じ問題を抱えていました。argparseバグトラッカーで解決策を見つけました:http ://code.google.com/p/argparse/issues/detail?id = 52

nargs='+'解決策は簡単です。 (または'*')を。に置き換えnargs=argparse.REMAINDERます。この特別な値は文書化されていませんが、必要なことを実行します。

于 2011-07-12T21:33:43.340 に答える
5

これらの問題の解決を開始するための最善の策は--、すべてのオプションの引数の後で試してみることだと思います。--は、後のすべてが位置引数であることをArgumentParserに通知する疑似引数です。ドキュメントはこちら

ある時点以降に引数が解析されないようにするために、argvの一部をparse_argsに渡すことができます。これをいくつかの内省と組み合わせて、解析対象を制限するために使用できます。

于 2011-06-27T05:37:10.753 に答える
-1

もう1つのオプションは、parse_known_argsを使用することです。これは、不明な引数が検出されたときに解析を停止します。

于 2014-08-05T13:27:22.367 に答える