2016-10-15 7 views
0

コマンドライン引数をファイルに入れて、argthonを使ってPythonプログラムに渡すことができます。接頭文字ではなく、次のようになります。 $ python myprogram.py 1 2 --foo 1 -A somefile.txt --bar 2 これはthis questionとほぼ同じですが、始めにいくつかの位置的な引数が必要です。その解決策がparse_argsを呼び出すと、ファイルに位置指定の引数がないと失敗します。argparseでオプション引数付きのファイルから引数を読み込む方法

答えて

1

somefile.txtprefix charを使用して、その後

one 
two 
three 

$ python myprogram.py 1 2 --foo 1 @somefile.txt --bar 2 

が含まれている場合は、右の構文解析の開始時に、効果的に言い換えれば

$ python myprogram.py 1 2 --foo 1 one two three --bar 2 

と同じです@ファイルが読み取られ、その内容がにスプライスされます0リスト。そこから解析が正常に行われます。

私が他の問題で提案したことの1つは、解析する前にスプライシングを実装することでした。

あなたが参照している答えは、customです。いつものAction時点でちょうどnamespacevalueを置き、このアクションは、ファイル読み込み、解析します。

parser.parse_args(f.read().split(), namespace) 

をバリアントは、メインnamespaceに新しいnamespaceと選択的にコピーする値に解析します。

あなたの問題は、パーサにいくつかの必要な引数があることです。このファイルに含まれていない場合、このparse_argsはエラーを発生させます。それは驚くべきことではありません。

解決策の1つは、このファイルに異なるparserを使用することです.1つは、ファイルの内容だけで動作するように設計されていることです。私はそれをグローバルに定義します。

alt_parser.parse_args(f.read().split(), namespace) 

言い換えれば、あなたは、パラメータとして渡された parserを使用する必要はありません。

この上の変化は名前空間にファイル名を入れて、最初の構文解析後にそれを処理することです:

args = parser.parse_args() 
if args.A: 
    argv = open(args.A).read().split() 
    args1 = alt_parser.parse_args(argv) 

しかし、あなたは私たちが、すでに解析されてきたものを引数言うことができない、頼むかもしれないとそれを考慮に入れて-Aを処理しますか? parserは状態マシンではありません。構文解析はその属性を変更しません。これまでの解析を反映する唯一の変数はnamespaceです。他のすべての解析変数は、呼び出しコードに対してローカルです。

+0

「@」はちょうど正しいことですが、別のプログラムの動作をコピーしています。意味あり;このトリックは、必要な位置のものを除いて同じ引数を持つ2番目のパーサを作成しています。 – petrelharp

+1

まず、そのパーサを作成して、それをメインのものの「親」として使うことができます。それでは、 '子に'ポジションを追加するだけです。 – hpaulj

関連する問題