Argparse with action =' store_true'没有按预期工作

时间:2017-05-15 21:05:59

标签: python python-2.7 scripting argparse

我们的想法是在运行脚本时添加一个标记(--slack-s),这样我就不必每次都注释掉rep.post_report_to_slack()方法我不想使用它。我跑的时候:

$ python my_script.py --slack

我收到错误:

my_script.py: error: unrecognized arguments: --slack

以下是代码:

def main():
    gc = Google_Connection()
    meetings = gc.meetings

    rep = Report(meetings)

    if args.slack:
        rep.post_report_to_slack()
        print('posted to slack')


if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--slack', help='post to slack', 
        action='store_true')
    args = parser.parse_args()
    main()

1 个答案:

答案 0 :(得分:2)

您的代码有效,但它依赖于args在模块命名空间中可用,这不是很好,因为,一方面,它意味着您无法在不从命令调用脚本的情况下使用您的函数线。更灵活和传统的方法是编写函数来接受它需要的任何参数,然后将从argparse获得的所有内容传递给函数:

# imports should usually go at the top of the module
import argparse

def get_meeting_report(slack=False):

    gc = Google_Connection()
    meetings = gc.meetings

    rep = Report(meetings)

    if slack:
        rep.post_report_to_slack()
        print('posted to slack')

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--slack', help='post to slack',
        action='store_true')
    args = parser.parse_args()
    args = vars(args)
    get_meeting_report(**args)

现在你也可以通过直接调用它来更容易地在argparse之外使用你的函数。