2017-10-12 4 views
1
私はこのようなコマンドライン文字列を解析する必要が


オプションと混在した複数の位置引数を解析するには?

node frontend.js project1.pro project2.pro ... projectN.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -opt1 value1 ... -opt2 value2 

すなわち、 ユーザー:(

で混合することができる(開始時にそれなし)オプション(ハイフン)と位置引数は、私はいくつかの位置引数を指定しようとするが、これは動作していなかった。

parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('--foo') 
parser.add_argument('project_files', default=[], nargs='+') 
parser.add_argument('-spec', nargs=1, required=True) 
parser.add_argument('other_options', default=[], nargs='+') 
print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split())) 

しかし、そのようですエラー:?!質問は愚かであれば間違ってやっている何

PROG: error: unrecognized arguments: CONFIG+=debug CONFIG+=qml_debug 

おかげ

PS申し訳ありませんが、私は新しいですPythonではこのようなライブラリを使用した引数解析が行われます。
P.P.S.引数は、 "ノードfrontend.jsは"

答えて

1
print(parser.parse_args('--foo B project_1.pro project_2.pro -spec linux-g++'.split())) 

Namespace(foo='B', other_options=['project_2.pro'], project_files=['project_1.pro'], spec=['linux-g++']) 

を生産無視される 'progject_2.pro' other_optionsにではなく、project_filesに割り当てられます。 2 nargs='+'の処理方法が原因です。

parse_argsは、ポジションとオプションを処理します(フラグが付いています)。そして、それは合うように多くのポジションを扱おうとします。これにより、1人または複数のユーザーがnargs+および*)のような「オープンエンド」の場合に予期しない結果につながる可能性があります。 argparse: nargs='*' positional argument doesn't accept any items if preceded by an option and another positional

https://bugs.python.org/issue9338 - - argparse optionals with nargs='?', '*' or '+' can't be followed by positionals


2343:~/mypy$ python stack46702635.py 
Namespace(foo='B', other=None, project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++') 
Namespace(foo='B', other=['CONFIG+=debug', 'CONFIG+=qml_debug'], project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++') 

https://bugs.python.org/issue15112その結果

parser = argparse.ArgumentParser(prog='PROG') 
parser.add_argument('--foo') 
parser.add_argument('project_files', nargs='+') 
parser.add_argument('--spec') 
parser.add_argument('--other', nargs='+') 
print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split())) 

print(parser.parse_args('--foo B project_1.pro project_2.pro --spec linux-g++ --other CONFIG+=debug CONFIG+=qml_debug'.split())) 

:私は変更することをお勧めしたい

other引数を省略し、parse_known_argsを使用できます。未知の文字列は別のリストに返されます。 optparsegetoptなどの

#parser.add_argument('other', nargs='...') 
print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++'.split())) 

print(parser.parse_known_args('--foo B project_1.pro project_2.pro --spec linux-g++ CONFIG+=debug CONFIG+=qml_debug'.split())) 

0859:~/mypy$ python stack46702635.py 
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), []) 
(Namespace(foo='B', project_files=['project_1.pro', 'project_2.pro'], spec='linux-g++'), ['CONFIG+=debug', 'CONFIG+=qml_debug']) 

以前のパーサーは、単にフラグが立てられた引数を処理して、リストとして残りを返されました。あなたはそれらを自分で解析しなければなりませんでした。

+0

したがって、通常のオプションで区切られた2つ以上の位置引数を持つことができます - あるいはargparseはそうすることはできません。 – eraxillan

+0

UPD:問題は、他のアプリケーション(Qt qmake)のコマンドラインフォーマットをサポートする必要がありますので、オプションフォーマットを変更できません:( – eraxillan

+0

2つのポジションの間に '-spec'が定義されているということは重要ではありません。構文解析はコマンドラインでの順序によって決まりますが、この種の処理の改良についてはバグや問題がいくつかありますが、正式な変更は行われていません。 – hpaulj

関連する問題