web-dev-qa-db-ja.com

Python argparse dict arg

コマンドラインからdict(str -> str)引数を受け取りたい。 argparse.ArgumentParserそれを提供しますか?または他のライブラリはありますか?

コマンドラインの場合:

program.py --dict d --key key1 --value val1 --key key2 --value val2

次の辞書が必要です。

d = {"key1": "val1", "key2": "val2"}
17
orion_tvv

カスタムアクションを使用した別のソリューションを次に示します。dictキーペアをコンマ区切りで指定する場合-

import argparse
import sys
parser = argparse.ArgumentParser(description='parse key pairs into a dictionary')

class StoreDictKeyPair(argparse.Action):
     def __call__(self, parser, namespace, values, option_string=None):
         my_dict = {}
         for kv in values.split(","):
             k,v = kv.split("=")
             my_dict[k] = v
         setattr(namespace, self.dest, my_dict)

parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, metavar="KEY1=VAL1,KEY2=VAL2...")

args = parser.parse_args(sys.argv[1:])
print args

ランニング:

python parse_kv.py --key_pairs 1=2,a=bbb,c=4 --key_pairs test=7,foo=bar

出力:

Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})

文字列のコンマ区切り値の代わりにnargsを使用する場合:

class StoreDictKeyPair(argparse.Action):
     def __init__(self, option_strings, dest, nargs=None, **kwargs):
         self._nargs = nargs
         super(StoreDictKeyPair, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
     def __call__(self, parser, namespace, values, option_string=None):
         my_dict = {}
         print "values: {}".format(values)
         for kv in values:
             k,v = kv.split("=")
             my_dict[k] = v
         setattr(namespace, self.dest, my_dict)

parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, nargs="+", metavar="KEY=VAL")

args = parser.parse_args(sys.argv[1:])
print args

ランニング

python arg_test4.py --key_pairs 1=2 a=bbb c=4 test=7 foo=bar

出力:

values: ['1=2', 'a=bbb', 'c=4', 'test=7', 'foo=bar']
Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
27
storm_m2138

私はこのようなものを使用します:

p = argparse.ArgumentParser()
p.add_argument("--keyvalue", action='append',
               type=lambda kv: kv.split("="), dest='keyvalues')

args = p.parse_args("--keyvalue foo=6 --keyvalue bar=baz".split())
d = dict(args.keyvalues)

単に(key, value)タプルのリストを蓄積するのではなく、解析されたキーと値のペアを辞書に直接「追加」するカスタムアクションを作成できます。 (私が見るのはskyline75489がしたことです;私の答えは、ペアを指定するために別個の--keyvalueオプションと--keyオプションの代わりに、カスタムタイプで単一の--valueオプションを使用することで異なります。

17
chepner

別の簡単な方法:

parser = argparse.ArgumentParser()
parser.add_argument('--key1')
parser.add_argument('--key2')
args = parser.parse_args()
my_dict = args.__dict__
4
Clemens69

Pythonは配列argvの形式で引数を受け取ります。これを使用して、プログラム自体に辞書を作成できます。

import sys
my_dict = {}
for arg in sys.argv[1:]:
    key, val=arg.split(':')[0], arg.split(':')[1]
    my_dict[key]=val

print my_dict

コマンドラインの場合:

python program.py key1:val1 key2:val2 key3:val3

出力:

my_dict = {'key3': 'val3', 'key2': 'val2', 'key1': 'val1'}

注:argsは文字列にあるため、数値を格納するには変換する必要があります。

役に立てば幸いです。

3
divyum

Python 3.6に単純な解決策があります。単純にargparse入力を辞書に変換しようとしている場合。例は次のとおりです。

import argparse 

parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help='the path to the input file')
parser.add_argument('-o', '--output', help='the path to the output file')
args = parser.parse_args()

arguments = dict(args._get_kwargs())

for k, v in arguments.items():
    print(k, v) 

python3 script_name.py --input 'input.txt' --output 'output.txt'などのコマンドライン入力を指定すると、コードは端末に出力されます。

input input.txt
output output.txt
1
Brian

Pythonの1行のargparse辞書引数 argparse_dictionary.py

# $ python argparse_dictionary.py --arg_dict=1=11,2=22;3=33 --arg_dict=a=,b,c=cc,=dd,=ee=,
# Namespace(arg_dict={'1': '11', '2': '22', '3': '33', 'a': '', 'c': 'cc', '': 'dd'})

import argparse

arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--arg_dict', action=type(b'', (argparse.Action,), dict(__call__=lambda self, parser, namespace, values, option_string: getattr(namespace, self.dest).update(dict([v.split('=') for v in values.replace(';', ',').split(',') if len(v.split('=')) == 2])))), default={}, metavar='KEY1=VAL1,KEY2=VAL2;KEY3=VAL3...')
print(arg_parser.parse_args())
1
miszel

次のような入力を解析する簡単な方法:

program.py --dict d --key key1 --value val1 --key key2 --value val2

は:

parser=argparse.ArgumentParser()
parser.add_argument('--dict')
parser.add_argument('--key', action='append')
parser.add_argument('--value', action='append')
args = parser.parse_args()

生成する必要があります(私のメンタルパーサーが正しい場合)

args = Namespace(dict='d', key=['key1','key2'], value=['value1','value2'])

あなたはそれから辞書を構築できるはずです:

adict = {k:v for k, v in Zip(args.key, args.value)}

args.dictを使用してこれをその名前の変数に割り当てるには、いくつかのun-pythonトリックが必要です。最善の方法は、この名前で別の辞書に要素を作成することです。

another_dict = {args.dict: adict}

このソリューションでは、多くのエラーチェックは実行されません。たとえば、同じ数のキーと値があることを確認しません。また、複数の辞書を作成することもできません(つまり、--dict引数を繰り返します)。特別な注文は必要ありません。 --dictは、--key key1ペアの後に発生する可能性があります。いくつかの--value引数を一緒にすることができます。

key=valuechepnerとして結び付けると、これらの問題の多くが回避されます。

0
hpaulj