首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Argparse + cmd2 RecursionError即使在简单的程序上也是如此

Argparse + cmd2 RecursionError即使在简单的程序上也是如此
EN

Stack Overflow用户
提问于 2020-08-21 14:16:14
回答 1查看 91关注 0票数 1

示例代码:

代码语言:javascript
复制
import argparse
import cmd2
import sys


def create_subparser(a_parser = None):
    if a_parser is None:
        new_parser = argparse.ArgumentParser()
    else:
        new_parser = a_parser.add_parser("single")
    new_parser.add_argument("--single-param", "-sp")
    return new_parser


def single_print(some_param):
    print("single operation " + str(some_param))


def other_print():
    print("other operation")


class TestCmd(cmd2.Cmd):
    single_parser = create_subparser()

    @cmd2.with_argparser(single_parser)
    def do_single(self, opts):
        print(opts)
        single_print(opts.single_param)

    def do_other(self, opts):
        other_print()


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(help="commands", dest="mode")
    create_subparser(subparsers)
    cmd_parser = subparsers.add_parser("cmd", help="shell")

    args = parser.parse_args()
    if args.mode == "single":
        single_print(args.single_param)
    else:
        sys.argv = [sys.argv[0]]  # cmd2 complains about unknown parameters without
        cmd = TestCmd()
        cmd.cmdloop()

在本例中,我试图编写一个既可以在单模式(program.py single -sp test)下运行,也可以在命令/提示模式(program.py cmd)下运行的程序,然后它将调用单模式或其他操作(在shell中,编写single -sp testother。无论如何,如果我尝试获取cmd2类内的do_single中使用的argparse的所有值,我得到的是EXCEPTION of type 'RecursionError' occurred with message: 'maximum recursion depth exceeded in comparison'。使用cmd2的debug,它是这样的:

代码语言:javascript
复制
Traceback (most recent call last):
File "/home/.../site-packages/cmd2/cmd2.py", line 2011, in onecmd_plus_hooks
    stop = self.onecmd(statement, add_to_history=add_to_history)
  File "/home/.../site-packages/cmd2/cmd2.py", line 2441, in onecmd
    stop = func(statement)
  File "/home/.../site-packages/cmd2/decorators.py", line 308, in cmd_wrapper
    return func(*args_list, **kwargs)
  File "test.py", line 28, in do_single
    print(opts)
  File "/usr/lib/python3.7/argparse.py", line 131, in __repr__
    arg_strings.append('%s=%r' % (name, value))
  File "/usr/lib/python3.7/argparse.py", line 131, in __repr__
    arg_strings.append('%s=%r' % (name, value))
  File "/usr/lib/python3.7/argparse.py", line 131, in __repr__
    arg_strings.append('%s=%r' % (name, value))
  [Previous line repeated 326 more times]
  File "/usr/lib/python3.7/argparse.py", line 129, in __repr__
    for name, value in self._get_kwargs():
  File "/usr/lib/python3.7/argparse.py", line 139, in _get_kwargs
    return sorted(self.__dict__.items())
RecursionError: maximum recursion depth exceeded in comparison

我之所以使用create_subparser函数,是因为我正在创建cmd2.Cmd子类要使用的子解析器,但是当从主shell调用时,我希望对这些模式使用相同的解析器。这基本上是一个最小的工作示例,我的代码有很多标志和诸如此类的东西。

还有一件事,这个问题似乎是因为print(opts)而发生的。它似乎试图执行vars(opts),当它试图枚举所有变量时,由于某些地方的递归,它耗尽了内存。如果我不尝试列出对象中的所有变量(例如,如果我只使用opts.single_param),它就会起作用。这似乎与我试图在cmd2内部和主程序中使用相同的argparser有关,但我不明白为什么会发生这种情况,以及它是否可以修复。

EN

回答 1

Stack Overflow用户

发布于 2020-08-22 03:28:48

没有cmd2我就不能运行你的代码。但我可以创建一个名称空间来展示您的问题。

代码语言:javascript
复制
In [429]: ns = argparse.Namespace(foo='bar', baz=12)                                                 
In [430]: ns.ns = ns                                                                                 
In [431]: print(ns)                                                                                  
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-431-0769451eb86e> in <module>
----> 1 print(ns)

/usr/lib/python3.6/argparse.py in __repr__(self)
    133         for name, value in self._get_kwargs():
    134             if name.isidentifier():
--> 135                 arg_strings.append('%s=%r' % (name, value))
    136             else:
    137                 star_args[name] = value

... last 1 frames repeated, from the frame below ...

/usr/lib/python3.6/argparse.py in __repr__(self)
    133         for name, value in self._get_kwargs():
    134             if name.isidentifier():
--> 135                 arg_strings.append('%s=%r' % (name, value))
    136             else:
    137                 star_args[name] = value

RecursionError: maximum recursion depth exceeded while calling a Python object

您可以测试各个属性,直到找到问题所在的属性:

代码语言:javascript
复制
In [432]: list(ns.__dict__.keys())                                                                   
Out[432]: ['foo', 'baz', 'ns']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63517444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档