2012-01-16 16 views
9

pythons argparseモジュールを使用して、cliパラメータ文字列を解析したいと考えています。これは、端末から渡されたパラメータに対しては動作しますが、指定された文字列では動作しません。どのように定義済みの引数文字列でPythonのargparseを使用できますか?

import argparse 

parser = argparse.ArgumentParser(description='Argparse Test script') 
parser.add_argument("param", help='some parameter') 

argString = 'someTestFile' 
print(argString) 

args = parser.parse_args(argString) 

私はこのスクリプトを実行すると、私はこの出力を得る:

~/someTestFile 
usage: argparsetest.py [-h] param 
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e 

~/someTestFileは何とかo m e T e s t F i l eに変換されます。すでに述べたように、端末からファイル名を渡すと動作します。

これは文字列エンコーディングと関係があります。誰かがこれを修正する方法を知っていますか?

+0

[argparse documentation](http://docs.python.org/library/argparse.html#parsing-arguments)をご覧ください。 –

答えて

19

ああ、いいえいいえ。 parser.parse_args()は、sys.argv[1:]と同じ形式のシーケンスを必要とします。 sys.argvシーケンスのような文字列を扱う場合、['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']が得られます。 's'が関連する引数になり、残りの文字列が解析不能になります。

代わりに、あなたはおそらくデフォルトsys.argvようparser.parse_args(['someTestFile'])

+0

ありがとう!それが...! – thorink

4

に渡したいが、あなたの引数が同様にリストする必要があり、リストです。

args = parser.parse_args([argString]) 
16

もう1つのオプションはshlex.splitです。それはそれは特に非常に便利なあなたが本当のCLI引数の文字列を持っている場合:

import shlex 
argString = '-vvvv -c "yes" --foo bar --some_flag' 
args = parser.parse_args(shlex.split(argString)) 
+1

ありがとう!これは非常に便利です。今私はコマンドラインからだけでなく、他のpythonスクリプトから実行することができます! – Sudhi

+0

誰かがこの人にクッキーを渡してください –

0

単にsplitあなたのコマンド文字列:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids') 
    argString = "--dummy_opt 128 128" 
    args = parser.parse_args(argString.split()) 

    print(args) 

意志の出力を:披露する

args = parser.parse_args(argString.split()) 

完全な例

Namespace(pic_resize=[128, 128])

関連する問題