[解決済み] python argparse を使って複数のネストしたサブコマンドを解析するには?
2023-01-12 19:43:32
質問
このようなインターフェイスを持つコマンドライン・プログラムを実装しています。
cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]
を経て
argparse ドキュメント
. 私は
GLOBAL_OPTIONS
をオプションの引数として実装することができます。
add_argument
で
argparse
. そして、その
{command [COMMAND_OPTS]}
を使って
サブコマンド
.
ドキュメントを見ると、サブコマンドは1つしか持てないようです。しかし、ご覧のように、私は1つ以上のサブコマンドを実装する必要があります。このようなコマンドライン引数を解析するための最良の方法は
argparse
?
どのように解決するのですか?
mgilson は、素敵な 回答 があります。しかし、sys.argvを自分で分割することの問題は、Argparseがユーザのために生成する素晴らしいヘルプメッセージをすべて失ってしまうということです。だから、私はこれを行うことを終了しました。
import argparse
## This function takes the 'extra' attribute from global namespace and re-parses it to create separate namespaces for all other chained commands.
def parse_extra (parser, namespace):
namespaces = []
extra = namespace.extra
while extra:
n = parser.parse_args(extra)
extra = n.extra
namespaces.append(n)
return namespaces
argparser=argparse.ArgumentParser()
subparsers = argparser.add_subparsers(help='sub-command help', dest='subparser_name')
parser_a = subparsers.add_parser('command_a', help = "command_a help")
## Setup options for parser_a
## Add nargs="*" for zero or more other commands
argparser.add_argument('extra', nargs = "*", help = 'Other commands')
## Do similar stuff for other sub-parsers
さて、最初のパースの後、すべての連鎖したコマンドは
extra
. 私はそれが空でない間、すべての連鎖したコマンドを取得し、それらのために別々の名前空間を作成するためにそれを再パースします。そして、私はargparseが生成する、より良い使用状況文字列を取得します。
関連
-
[解決済み】Pythonのvirtualenvを離脱/終了/無効化する方法
-
[解決済み] argparseによるブーリアン値のパース
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] コマンドライン引数の読み方・処理方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] argparse: どのサブパーサーが使用されたかを特定する [重複].
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。