web-dev-qa-db-ja.com

Argparseで他の引数に依存する引数

私はこのようなことを達成したいです:

-LoadFiles
    -SourceFile "" -DestPath ""
    -SourceFolder "" -DestPath ""
-GenericOperation
    -SpecificOperation -Arga "" -Argb ""
    -OtherOperation -Argc "" -Argb "" -Argc ""

ユーザーは次のようなことを実行できるはずです。

-LoadFiles -SourceFile "somePath" -DestPath "somePath"

または

-LoadFiles -SourceFolder "somePath" -DestPath "somePath"

基本的に、-LoadFilesを使用している場合は、後に-SourceFileまたは-SourceFolderを使用する必要があります。 -SourceFileをお持ちの場合は、-DestPathなどが必要です。

他の引数に必要な引数のこのチェーンは可能ですか?そうでない場合、少なくとも次のようなことはできますか。-SourceFileがある場合は、-DestPathが必要です。

18
user3715648

作成したArgumentParserインスタンスでparse_argsを呼び出すと、Namespaceオブジェクトが提供されます。引数の1つが存在する場合、もう1つの引数も存在する必要があることを確認してください。お気に入り:

args = parser.parse_args()
if ('LoadFiles' in vars(args) and 
    'SourceFolder' not in vars(args) and 
    'SourceFile' not in vars(args)):

    parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile')
19
randomusername

Argparseでサブパーサーを使用できます

 import argparse
 parser = argparse.ArgumentParser(prog='PROG')
 parser.add_argument('--foo', required=True, help='foo help')
 subparsers = parser.add_subparsers(help='sub-command help')

 # create the parser for the "bar" command
 parser_a = subparsers.add_parser('bar', help='a help')
 parser_a.add_argument('bar', type=int, help='bar help')
 print(parser.parse_args())
14

あなたが言及したようなケースを簡単に管理できるいくつかのargparse代替案があります。 click または docopt のようなパッケージ。

Argparseでチェーン引数の手動実装を回避したい場合は、たとえばクリックで Commands and Groups を確認してください。

2
Mark

--makeDependencyを指定した場合に、値とともに--dependencyも指定するように強制するサンプルを以下に示します。

これはargparseだけで行われるのではなく、後でユーザーが指定したものを検証するプログラムによっても行われます。

#!/usr/bin/env python
import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true')
parser.add_argument('--dependency', help='dependency example')

args = parser.parse_args()

if args.makeDependency and not args.dependency:
    print "error on dependency"
    sys.exit(1)

print "ok!"
1
Reut Sharabani