2012-10-11 11 views
70

私は--pm-exportのようなargparseモジュールでいくつかのオプションを持っていますが、args.pm-exportのようなものを使用しようとすると、pmというエラーが出ます。この問題を回避するにはどうすればよいですか?コマンドラインオプションで-を使用することは可能ですか?ダッシュでargparseのオプションを持つ

答えて

90

オプションの引数アクションの場合、DESTの値は、通常、オプション文字列から推測されます。 ArgumentParserは、最初の長いオプション文字列を取り、最初に--文字列を取り除いてを取り、destの値を生成します。 どれ内部-文字は、文字列が有効な属性名

ですですから、args.pm_exportを使用する必要があることを確認する_文字に変換されます。

13

ダッシュをアンダースコアに変換されます。indicated in the argparse docsとして

import argparse 
pa = argparse.ArgumentParser() 
pa.add_argument('--foo-bar') 
args = pa.parse_args(['--foo-bar', '24']) 
print args # Namespace(foo_bar='24') 
+2

のみオプションの引数のために。ハイフンを保持するために必要なものなので、アンダースコアを使用してアクセス可能にする必要があります。 – n00dle

54

残念ながら、ダッシュツーアンダースコア交換はpositionalargumentsのために動作しません(--で始まるない)

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs-dir', 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results-csv', type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>) 

ようなので、あなたは、属性名とのmetavar kwargとしてadd_argument()に第1 'の引数を使用する必要がありますそれが助けにどのように見えるべきかを設定:

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('logs_dir', metavar='logs-dir', 
        nargs=1, 
        help='Directory with .log and .log.gz files') 
parser.add_argument('results_csv', metavar='results-csv', 
        nargs=1, 
        type=argparse.FileType('w'), 
        default=sys.stdout, 
        help='Output .csv filename') 
args = parser.parse_args() 
print args 

# gives 
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>]) 
+4

関連するPythonバグレポート:http://bugs.python.org/issue15125。 'argparse'は' setattr'と 'getattr'を使うので、' dest'名は有効な 'dot'属性名である必要はありません。ユーザーは 'getattr'を使うこともできます。 – hpaulj

+3

私は 'position_arg = getattr(parser、 'positional-arg')' –

+0

を実行しました。私が必要としていたことを正確に - 私は 'metavar'で後方に行って、なぜ動作していないのか分からなかった。ありがとう! – dwanderson