コマンドラインからdict(str -> str)
引数を受け取りたい。 argparse.ArgumentParser
それを提供しますか?または他のライブラリはありますか?
コマンドラインの場合:
program.py --dict d --key key1 --value val1 --key key2 --value val2
次の辞書が必要です。
d = {"key1": "val1", "key2": "val2"}
カスタムアクションを使用した別のソリューションを次に示します。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'})
私はこのようなものを使用します:
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
オプションを使用することで異なります。
別の簡単な方法:
parser = argparse.ArgumentParser()
parser.add_argument('--key1')
parser.add_argument('--key2')
args = parser.parse_args()
my_dict = args.__dict__
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は文字列にあるため、数値を格納するには変換する必要があります。
役に立てば幸いです。
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
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())
次のような入力を解析する簡単な方法:
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=value
をchepner
として結び付けると、これらの問題の多くが回避されます。