質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

462閲覧

python ArgumentParserの使い方

sou00

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/05 05:51

編集2019/04/05 06:45

前提・実現したいこと

python 2.6.6 でスクリプト(test.py)を作成しています。
ArgumentParserを使ってコマンドライン引数の解析をしていますが、
以下のようなコマンドライン引数パターンのみを許容するコーディング方法が分かりません。
どのようにコーディングすればよろしいでしょうか?

test.py [-d path [-c count]|-f file...|file...]

[パターン1]
test.py (引数無し)

[パターン2]
test.py file...(複数ファイル指定可能)

[パターン3]
test.py -f file...(複数ファイル指定可能)

[パターン4]
test.py -d path

[パターン5]
test.py -d path -c count

上記の5パターン以外の引数の組み合わせではエラーとしたいです。

[エラーパターン例]
test.py -d path -f file1 ・・・「-d」と[-f」の同時指定によりエラー
test.py -c count ・・・「-c」の単独指定によりエラー
test.py file1 file2 -f file3 file4 ・・・オプション無しfileと[-f」の同時指定によりエラー

単純な引数排他ではparser.add_mutually_exclusive_groupを使用すればいいと思うのですが、
「-c」は「-d」とセットにするやり方が分かりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

公式ドキュメントをよんでください。
argparse --- コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.7.3 ドキュメント

python

1import argparse 2import sys 3 4parser = argparse.ArgumentParser() 5parser.add_argument("file", nargs='*') 6parser.add_argument("-f", nargs='+') 7parser.add_argument("-d") 8parser.add_argument("-c") 9args = parser.parse_args() 10 11print('file', args.file) 12print('f', args.f) 13print('d', args.d) 14print('c', args.c)
[パターン1] $ test.py file [] f None d None c None [パターン2] $ test.py file1 file2 file ['file', 'file'] f None d None c None [パターン3] $ test.py -f file1 file2 file [] f ['file1', 'file2'] d None c None [パターン4] $ test.py -d path file [] f None d dirpath c None [パターン5] $ test.py -d path -c count file [] f None d path c 1

投稿2019/04/05 06:12

編集2019/04/05 06:13
tiitoi

総合スコア21960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sou00

2019/04/05 06:42

tiitoi様 回答ありがとうございます。 申し訳ありません、質問内容に「以下のようなコマンドライン引数パターンのみを許容する」と記載しましたが、言葉が足りませんでした。 記載の5パターン以外の引数の組み合わせではエラーとしたいです。 [エラーパターン例] test.py -d path -f file1 ・・・「-d」と[-f」の同時指定によりエラー test.py -c count ・・・「-c」の単独指定によりエラー test.py file1 file2 -f file3 file4 ・・・オプション無しfileと[-f」の同時指定によりエラー 単純な引数排他ではparser.add_mutually_exclusive_groupを使用すればいいと思うのですが、 「-c」は「-d」とセットにするやり方が分かりませんでした。
tiitoi

2019/04/05 08:27 編集

「-c」は「-d」とセットにして、add_mutually_exclusive_group に指定するということはできないと思います。 if 文等駆使すれば、許容するパターンの条件をかけるのではないですか。
sou00

2019/04/05 12:34

tiitoi様 今回のパターンではArgumentParserは向いていないと理解しました。 煩雑になりましたが、以下のようにすることで対応出来ました。 有難うございました。 ===== 以下コード ===== import sys # # 初期化 # flg = {"N":0,"-d":0,"-c":0,"-f":0} # オプションフラグ val = {"N":[],"-d":[],"-c":[],"-f":[]} # オプション値 err = 0 # エラーフラグ # # 引数取得 # opt = "N" # デフォルトのオプション for arg in sys.argv[1:]: # 引数毎ループ if arg[0] == "-": # 引数は「-」から始まるか? if arg in flg: # 想定している引数か? opt = arg # オプション文字を保存 flg[opt] = 1 # 当該オプションフラグを立てる else: # 想定していない引数 err = 1 # エラーフラグを立てる else: # 引数は「-」から始まらない val[opt].append(arg) # オプション値リストに保存 flg[opt] = 1 # 当該オプションフラグを立てる(「-」無し引数用) # # エラーチェック # if flg["-d"] and not val["-d"]: err = 1 # -dがONだが値が無い為エラー if flg["-c"] and not val["-c"]: err = 1 # -cがONだが値が無い為エラー if flg["-f"] and not val["-f"]: err = 1 # -fがONだが値が無い為エラー if flg["-c"] and not flg["-d"]: err = 1 # -cがONかつ-dがOFFの為エラー if (flg["N"] or flg["-d"]) and (flg["-d"] or flg["-f"]) and (flg["N"] or flg["-f"]): err = 1 # 「-」無し引数、-d、-fのうち2つ以上がONの為エラー if err: # エラーフラグ有り? print "error" exit() # # 処理分岐 # if not (flg["N"] or flg["-d"] or flg["-f"]): print "パターン1" if flg["N"]: print "パターン2: ",val["N"] if flg["-f"]: print "パターン3: ",val["-f"] if flg["-d"] and not flg["-c"]: print "パターン4: ",val["-d"] if flg["-c"]: print "パターン5: ",val["-c"]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問