0

Arch Linuxと同じスタイルで使用するPythonスクリプトを作成していますpacman。要約すると、次のようになります。

prog <operation> [options] [targets]
  • 操作の形式は-X(ハイフン、大文字)であり、スクリプトを呼び出すときに1つ必要です。
  • オプションの形式は-x(ハイフン、小文字)であり、操作ごとに異なる意味を持つ場合があります。

例えば:

  • pacman -Syuとオプションを使用してsync操作を実行し、システム全体を新しいパッケージでアップグレードすることを意味します。refreshsysupgrade
  • pacman -Ququeryオプションを指定して操作を実行し、upgrades古いパッケージをすべて一覧表示することを意味します。
  • pacman -Ss <arg>は、同期パッケージで検索するパターンとして別の引数を期待するオプションを使用してsync操作を実行することを意味します。search

パンチライン:

私はPython用のargparseライブラリを調べて、これを実装する方法を見つけようとしています。私はこれまでにいくつかの問題/設計の問題に遭遇しました:

  • argparseオプションの引数として、ハイフンで始まる引数のみを受け入れます。私のすべての「操作」は、絶対に必要な場合、オプションの引数として表示されます。
  • スクリプトに1つの「位置」/必須の引数を持たせることができます。これは操作(upgradeまたはのような単語に操作を切り替える必要がありaddます)と、それに続くオプションの引数です。--helpただし、これでも、same-option-symbol-working-differentlyの問題は解決されず、サポートされているすべての操作をテキストで簡単にリストすることもできません。

この引数の解析を処理する最もスムーズな方法は何ですか?私はコマンドの使用法を変更することに反対していませんが、上で述べたように、私が知る限り、それは私の状況を助けていないようです。

ありがとう

4

3 に答える 3

1

1つのオプションは、キーワード引数がに設定された相互に排他的なオプショングループを作成-Sしてその一部にすることです。これは、それらを最初に与えられた引数にするという要件を強制するものではなく、また、それぞれで使用できる他のオプションを制限するものでもありません。を呼び出した後、後者を強制する必要があります。-QrequiredTrueparse_args

私が考えたもう1つのオプションは-S-Qサブコマンドを作成することでした。add_parser'-'で始まる最初の引数で呼び出すことは合法のようですが、実際にスクリプトを呼び出そうとしたときに発生するエラーにより、サポートにバグがあるか意図しないか、エラー報告にバグがあると思われます。

于 2012-08-09T19:42:01.463 に答える
0

さらに別のオプションは、次を使用することです:http getopt: //docs.python.org/library/getopt.html

于 2012-08-09T19:45:56.063 に答える
0

そのため、argparseヘルプに埋め込まれたサブコマンドのこのサポートを見つけました。それはまさに私が必要としているものですが、唯一の注意点は-X、操作の形式として使用していないことです。add代わりに、のような単語を使用していますsearch

完全を期すために、上記のリンクからサブパーサーを使用する例を次に示します。

>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)
于 2012-08-17T15:50:06.033 に答える