13

argparseモジュールを使用してコマンドライン オプションを解析する Python プログラムを作成しようとしています。

名前付きまたは位置指定可能なオプションの引数を作成したいと考えています。たとえば、myScript --username=batmanと同じことをしたいmyScript batman。またmyScript、ユーザー名なしで有効にしたいです。これは可能ですか?もしそうなら、どうすればそれを行うことができますか?

以下のコードに似たさまざまなことを試しましたが、成功しませんでした。

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()

編集:上記のコードは、という例外をスローしますValueError: mutually exclusive arguments must be optional

OS X 10.8.4 で Python 2.7.2 を使用しています。

編集:ガブリエル・ヤコブソンの提案を試しましたが、すべての場合に正しく機能させることができませんでした。

私はこれを試しました:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)

and runningmyScript batmanは を出力しますNamespace(user_name='batman')が、myScript -u batmanandmyScript --user-name=batmanは を出力しますNamespace(user_name='admin')

最初の行で名前user-nameをに変更しようとしましたが、プログラムの実行方法によっては、名前空間またはエラーの両方が発生することがありました。user_nameadd_argumentbatmanadmin

2行目の名前user_nameをに変更しようとしましたが、プログラムの実行方法に応じて、またはのいずれかが出力されます。user-nameadd_argumentNamespace(user-name='batman', user_name='admin')Namespace(user-name='admin', user_name='batman')

4

3 に答える 3

5

これがあなたが望むすべてを行うと私が思う解決策です:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", "--user-name", default="admin")
    # Gather all extra args into a list named "args.extra"
    parser.add_argument("extra", nargs='*')
    args = parser.parse_args()
    # Set args.user_name to first extra arg if it is not given and len(args.extra) > 0
    if args.user_name == parser.get_default("user_name") and args.extra:
        args.user_name = args.extra.pop(0)
    print args

myScript -u batmanまたはを実行するとmyScript --user-name=batmanargs.user_nameが「バットマン」に設定されます。myScript batmanすると、args.user_name再び「バットマン」に設定されます。そして最後に、単にmyScript,args.user_nameを「admin」に設定します。

また、おまけとして、スクリプトに渡されたすべての追加引数が に保存されargs.extraます。お役に立てれば。

于 2013-07-23T02:37:49.033 に答える