Python:从命令行调用时如何启用 kwargs? (也许与 argparse)

新手上路,请多包涵

假设我有模块 myscript.py;此模块是生产代码,通常称为 %dir%>python myscript.py foo bar

我想扩展它以接受关键字参数。我知道我可以使用下面的脚本来获取这些参数,但不幸的是必须使用

%dir%>python myscript.py main(foo, bar)

我知道我可以使用 argparse 模块,但我不确定该怎么做。

 import sys

def main(foo,bar,**kwargs):
    print 'Called myscript with:'
        print 'foo = %s' % foo
        print 'bar = %s' % bar
        if kwargs:
            for k in kwargs.keys():
                print 'keyword argument : %s' % k + ' = ' + '%s' % kwargs[k]

if __name__=="__main__":
    exec(''.join(sys.argv[1:]))

原文由 Dr. John A Zoidberg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

如果你想像在主函数中一样传递关键字参数, key=value ,你可以这样做:

 import sys

def main(foo, bar, *args):
    print "Called my script with"

    print "foo = %s" % foo
    print "bar = %s" % bar

    for arg in args:
        k = arg.split("=")[0]
        v = arg.split("=")[1]

        print "Keyword argument: %s = %s" % (k, v)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        raise SyntaxError("Insufficient arguments.")
    if len(sys.argv) != 3:
        # If there are keyword arguments
        main(sys.argv[1], sys.argv[2], *sys.argv[3:])
    else:
        # If there are no keyword arguments
        main(sys.argv[1], sys.argv[2])

一些例子:

 $> python my_file.py a b x=4
Called my script with
foo = a
bar = b
Keyword argument: x = 4
$> python my_file.py foo bar key=value
Called my script with
foo = foo
bar = bar
Keyword argument: key = value

但是,这假定键和值之间没有任何空格, key = value 将不起作用。

如果您正在寻找 --argument 种关键字参数,您 应该 使用 argparse

原文由 Moon Cheesez 发布,翻译遵循 CC BY-SA 3.0 许可协议

@Moon 用类似的解决方案打败了我,但我建议事先进行解析并传入实际 kwargs

 import sys

def main(foo, bar, **kwargs):
    print('Called myscript with:')
    print('foo = {}'.format(foo))
    print('bar = {}'.format(bar))
    for k, v in kwargs.items():
        print('keyword argument: {} = {}'.format(k, v))

if __name__=='__main__':
    main(sys.argv[1], # foo
         sys.argv[2], # bar
         **dict(arg.split('=') for arg in sys.argv[3:])) # kwargs

# Example use:
# $ python myscript.py foo bar hello=world 'with spaces'='a value'
# Called myscript with:
# foo = foo
# bar = bar
# keyword argument: hello = world
# keyword argument: with spaces = a value

原文由 user94559 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题