import sys
def fun( a=7, b=1 ):
print a, b
fun()
fun( a=5 )
fun( sys.argv[1:] )
第一个fun()打印出'7,1',第二个打印出'5,1',但第三个打印出'['a = 8','b = 6'] 1]'。我希望能够用
打电话给我的节目python my_program.py a=5 b=6
更改打印的a和b的值。但这不起作用,因为sys.argv [1]是一个字符串列表。
有没有办法将字符串列表转换为函数可以理解的格式?
答案 0 :(得分:4)
使用**
进行kwarg解包:
d = {}
for a in sys.argv[1:]:
k, v = a.split('=')
d[k] = int(v)
func(**d)
另一种方法,使用csv
模块:
import csv
func(**{k: int(v) for k, v in csv.reader(sys.argv[1:], delimiter='=')})
正如@MartijnPieters所说,您可以使用argparse
模块
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-a', type=int)
parser.add_argument('-b', type=int)
args = parser.parse_args()
fun(**dict(args._get_kwargs()))
但是你必须调整输入参数的方式
答案 1 :(得分:4)
使用*
将列表解压缩到参数中:
fun(*sys.argv[1:])
请注意,这将导致 string 参数; sys.argv
命令行条目始终是字符串。
您可能需要查看argparse
module来处理命令行参数,包括自动转换:
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-a', type=int, default=7)
parser.add_argument('-b', type=int, default=1)
args = parser.parse_args()
func(args.a, args.b)
然后使用:
$ python my_program.py -a=5 -b=6
此处的附加优势是您可以获得正确的帮助反馈,和遵循标准命令行约定:
$ python my_program.py --help
usage: [-h] [-a A] [-b B]
Process some integers.
optional arguments:
-h, --help show this help message and exit
-a A
-b B