这里有类似的解决方案,但它们要么处理更旧版本的 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 本身有很多文档,但是我一直很难找到像我正在做的那样使用子解析器的东西。如果有更好的方法来执行子命令,我会全力以赴。