0

这里有类似的解决方案,但它们要么处理更旧版本的 python,要么只处理解析器而不处理子解析器。我正在编写一个带有简单命令行界面的程序。我希望脚本有子命令。最终结果将如下所示:

$ myprogram subcommand1 argument1 

或者:

$ myprogram subcommand 2 

等等

看起来这样做的方法是使用子解析。我已经阅读了关于 subparsing 的 python3 文档并相应地对我的脚本进行了建模,但我遇到了错误。似乎我的一些子命令有参数而其他子命令没有。这是我尝试过的:

import argparse

def main():
    parser = argparse.ArgumentParser('Sumarian Translator')
    subparsers = parser.add_subparsers()
    parser_translate = subparsers.add_parser('translate', help='Start Translation from file')
    parser_transfer.add_argument('file_to_translate', type=str, help='Name of the file')
    parser_login = subparsers.add_parser('login', help='Log in to the program')
    parser_userinfo = subparsers.add_parser('userinfo', help='Displays user info')
    parse_translate.set_defaults(func=translate)
    parser_login.set_defaults(func=login)
    parser_userinfo.set_defaults(func=userinfo)
    args = parser.parse_args()
    args.func(args)

def translate(args):
    translate_file = args.file_to_translate
    print("File Translated")

def login(): 
    print("Logged in")

def userinfo():
    print("User info displayed")

if __name__ == '__main__':
    main()

出现问题的行是“args.func(args)”行。如果我在括号中包含 args,则不带参数的函数将不起作用。如果我不包含 args,显然接受单个参数的函数不起作用。

当我在 args.fun 括号中有“args”时调用 login 时的个别错误是:

TypeError: login() takes 0 positional arguments but 1 was given

如果我删除 args 并尝试调用 translate,我会得到: TypeError: transfer() missing 1 required positional argument: 'args'

最后,如果我不包含这样的子命令:$ main.py

我得到: AttributeError: 'Namespace' object has no attribute 'func' 理想情况下,我希望它像 --help 一样显示用法

任何见解都会有所帮助。同样,argparse 本身有很多文档,但是我一直很难找到像我正在做的那样使用子解析器的东西。如果有更好的方法来执行子命令,我会全力以赴。

4

0 回答 0