运行 python 带有 argparser 的脚本

running python script with argparser

尝试使用 argparser 运行 我的脚本,但程序没有 运行,除非有正确的参数,但它似乎不起作用;

AttributeError: 'Namespace' object has no attribute 'func'
import sys
import argparse

from develop import Autogit as gt



def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # Create argument command
    parser_update = subparsers.add_parser('--sync', help='Sync local and remote repos')
    parser_update.set_defaults(func=gt.run)

    # Adding arguments
    parser.add_argument('--sync', type=str, required=True)

    if len(sys.argv) <= 1:
        sys.argv.append('--help')

    options = parser.parse_args()
    options.func()   # <--- Causes the error

if __name__ == '__main__':
    main()

此外,当给出 --sync arg 时,它会要求另一个参数,然后当我再添加一个参数时。 SYNC,然后returns属性错误。

编辑

正在尝试使程序 运行 成为 develop.Autogit.run

工作..

还必须在我调用的 运行 函数中添加 args 作为参数。

我认为您要完成的是设置默认值,通常这是通过 ArgumentParser.set_defaults() 完成的。您需要使用未初始化的函数来执行此操作。看这个例子:

import sys
import argparse

def f(args):
    print("In func")
    print(args)

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # Create argument command
    parser_update = subparsers.add_parser("sync", help="Sync local and remote repos")

    parser_update.set_defaults(func=f)  # <-- notice it's `f` not `f()`

    options = parser.parse_args()
    options.func(options)

if __name__ == "__main__":
    main()

顺便说一句,当您在多个地方定义相同的参数 (--sync) 时,您的代码片段会遇到更多问题。当使用 subparsers 时,习惯上将这些设置为位置(无前导 --),以便它们充当子命令。


这是我将与子命令一起使用的典型命令行:

import sys
import argparse

def f(args):
    print("In func f")
    print(args)

def g(args):
    print("In func g")
    print(args)

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(dest="command")

    parser_update = subparsers.add_parser("sync", help="Sync local and remote repos")
    parser_update.set_defaults(func=f)

    parser_delete = subparsers.add_parser("delete", help="Delete sub-command")
    parser_delete.set_defaults(func=g)

    options = parser.parse_args()
    if options.command is not None:
        options.func(options)
    else:
        parser.print_help()
        parser.exit()

if __name__ == "__main__":
    main()