Python argparse出现在gc.garbage中 [英] Python argparse appears in gc.garbage

查看:217
本文介绍了Python argparse出现在gc.garbage中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在python应用程序中调试内存泄漏,并且可以看到很多属于该模块的非收集对象 argparse



这里有一个重现错误的小脚本

  import gc 
gc.set_debug( gc.DEBUG_LEAK)
$ b $ def get_cli_arguments():
import argparse
parser = argparse.ArgumentParser(description ='启动一个RHM服务器')
parser.add_argument(
'--port',
metavar ='port',
type = int,
nargs ='?',
help ='服务器端口',
default = 8003

return vars(parser.parse_args())


def main():
args = get_cli_arguments( )
x =AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

$ b $ main()
gc.collect()
print(gc.garbage)

并且我得到了以下输出:

  gc:可收集< dict 0x7f9a8b303c58&g吨; 
gc:可收集< dict 0x7f9a8b303d70>
gc:可收集< list 0x7f9a8b350ea8>
gc:可收集< list 0x7f9a8b350b00>
gc:可收集< list 0x7f9a8b3dca70>
gc:可收集< _ArgumentGroup 0x7f9a8b3e6250>
gc:可收集< dict 0x7f9a8b301910>
gc:可收集< list 0x7f9a8b3535a8>
gc:可收集< list 0x7f9a8b3e1758>
gc:可收集< function 0x7f9a8b3d2d70>
gc:可收集< dict 0x7f9a8b301a28>
gc:可收集< list 0x7f9a8b3e17e8>
gc:可收集< _HelpAction 0x7f9a8b3e60d0>
gc:可收集< dict 0x7f9a8b3014b0>
gc:可收集< HelpFormatter 0x7f9a8b2f7f90>
gc:可收集< _Section 0x7f9a8b2f7fd0>
gc:可收集< dict 0x7f9a8b3016e0>
gc:可收集< list 0x7f9a8b350248>
gc:可收集< dict 0x7f9a8b3015c8>
gc:可收集< dict 0x7f9a8b303e88>
gc:可收集< list 0x7f9a8b3e1d40>
gc:可收集< _StoreAction 0x7f9a8b30a090>
gc:可收集< dict 0x7f9a8b2f9c58>
gc:可收集< HelpFormatter 0x7f9a8b30a0d0>
gc:可收集< _Section 0x7f9a8b30a110>
gc:可收集< dict 0x7f9a8b3017f8>
gc:可收集< list 0x7f9a8b36c200>
gc:可收集< dict 0x7f9a8b301b40>
[{'action':{'store_false':< class'argparse._StoreFalseAction'> ;,'append_const':< class'argparse._AppendConstAction'> ;,'help':< class'argparse ._HelpAction'> ;,无:< class'argparse._StoreAction'>,'store_true':< class'argparse._StoreTrueAction'> ;,'count':< class'argparse._CountAction'> ;,' store_const':< class'argparse._StoreConstAction'>,'version':< class'argparse._VersionAction'> ;,'store':< class'argparse._StoreAction'> ;,'parsers':< class'argparse._SubParsersAction'> ;,'append':< class'argparse._AppendAction'>},'type':{None:< 0x7f9a8b3d2d70>}的功能标识},{'store_false':< class 'argparse._StoreFalseAction'>,'append_const':< class'argparse._AppendConstAction'> ;,'help':< class'argparse._HelpAction'> ;, None:< class'argparse._StoreAction'> ,'stor 'class'argparse._StoreTrueAction'> ;,'count':< class'argparse._CountAction'> ;,'store_const':< class'argparse._StoreConstAction'> ;,'version':< 'argparse._VersionAction'> ;,'store':< class'argparse._StoreAction'> ;,'parsers':< class'argparse._SubParsersAction'> ;,'append':< class'argparse._AppendAction '>},[_HelpAction(option_strings = [' - h','--help'],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type = None ,options = None,help ='show this help message and exit',metavar = None),_StoreAction(option_strings = [' - port'],dest ='port',nargs ='?',const = None,default = 8003,type =< type'int'>,choices = None,help ='服务器端口',metavar ='port')],[],[],< argparse._ArgumentGroup object at 0x7f9a8b3e6250> ;, {'_mutually_exclusive_groups':[],'_negative_number_matcher':< _sre.SRE_Pattern object at 0x7f9a8b437290 > ;,'description':None,'_option_string_actions':{'--port':_StoreAction(option_strings = [' - port'],dest ='port',nargs ='?',const = None,default = 8003,type =< type'int'> ;, choices = None,help ='服务器端口',metavar ='port'),'-h':_HelpAction(option_strings = [' - h',' - 帮助'],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type = None,choices = None,help ='显示此帮助信息并退出',metavar = None ),'--help':_HelpAction(option_strings = [' - h','--help'],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type =无,选择=无,帮助='显示此帮助信息并退出',metavar =无)},'title':'可选参数','_has_negative_number_optionals':[],'_defaults':{},'prefix_chars' :' - ','argument_default':None,'_registries':{'action':{'store_false':< class'argparse._StoreFalseAction'> ;,'append_const':< class'arg parse._AppendConstAction'>'help':< class'argparse._HelpAction'>,None:< class'argparse._StoreAction'> ;,'store_true':< class'argparse._StoreTrueAction'> ;, 'count':< class'argparse._CountAction'> ;,'store_const':< class'argparse._StoreConstAction'> ;,'version':< class'argparse._VersionAction'> ;,'store':< ;'class'argparse._StoreAction'> ;,'parsers':< class'argparse._SubParsersAction'> ;,'append':< class'argparse._AppendAction'>},'type':{None:<函数标识0x7f9a8b3d2d70>}},'_group_actions':[_HelpAction(option_strings = ['-h','--help'],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type = None,choices = None,help ='显示帮助信息并退出',metavar = None),_StoreAction(option_strings = [' - port'],dest ='port',nargs ='? ',const = None,default = 8003,type =< type'int'>,choices = None,h elp ='服务器端口',metavar ='port')],'_action_groups':[],'conflict_handler':'error','_actions':[_HelpAction(option_strings = [' - h','--help '],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type = None,choices = None,help ='显示帮助信息并退出',metavar = None) ,_StoreAction(option_strings = [' - port'],dest ='port',nargs ='?',const = None,default = 8003,type =< type'int'> ;, choices = None,help = '服务器端口',metavar ='port')]},[],[_HelpAction(option_strings = ['-h','--help'],dest ='help',nargs = 0,const = None, default ='== SUPPRESS ==',type = None,choices = None,help ='显示此帮助信息并退出',metavar = None),_StoreAction(option_strings = [' - port'],dest ='port ',nargs ='?',const = None,default = 8003,type =< type'int'> ;, options = None,help ='服务器端口',metavar ='port')],< function 0x7f9a8b3d2d70>处的身份,{无:<功能标识符在'0x7f9a8b3d2d70>},['-h','--help'],_HelpAction(option_strings = ['-h','--help'],dest ='help',nargs = 0,const = None,默认='== SUPPRESS ==',类型=无,选择=无,帮助='显示此帮助信息并退出',metavar =无),{'const':无,'help':'显示此帮助信息退出','option_strings':['-h','--help'],'dest':'help','required':False,'nargs':0,'choices':None,'default' :'== SUPPRESS ==','container':< argparse._ArgumentGroup object at 0x7f9a8b3e6250>,'type':None,'metavar':None},< argparse.HelpFormatter object at 0x7f9a8b2f7f90>,< argparse。 _Section object at 0x7f9a8b2f7fd0>,{'items':[],'formatter':< argparse.HelpFormatter object at 0x7f9a8b2f7f90> ;,'heading':None,'parent':None},[],{'_current_indent':0 ,'_level':0,'_indent_increment':2,'_action_max_length':0,'_max_help_position':24,'_width :78,'_root_section':< argparse._Section对象在0x7f9a8b2f7fd0> ;,'_long_break_matcher':< _sre.SRE_Pattern对象在0x7f9a8b33e258> ;,'_prog':'prout.py','_current_section':< argparse._Section对象在0x7f9a8b2f7fd0> ;,'_whitespace_matcher':< _sre.SRE_Pattern object at 0x7f9a8b347750>},{'--port':_StoreAction(option_strings = [' - port'],dest ='port',nargs ='?' ,const = None,default = 8003,type =< type'int'> ;, options = None,help ='服务器端口',metavar ='port'),'-h':_HelpAction(option_strings = [' -h','--help'],dest ='help',nargs = 0,const = None,default ='== SUPPRESS ==',type = None,choices = None,help ='显示此帮助消息和'exit',metavar = None),'--help':_HelpAction(option_strings = [' - h','--help'],dest ='help',nargs = 0,const = None,default ='= = SUPPRESS ==',type = None,choices = None,help ='show this help message and exit',metavar = None)},['--port'],_S toreAction(option_strings = [' - port'],dest ='port',nargs ='?',const = None,default = 8003,type =< type'int'> ;, choices = None,help ='服务器端口',metavar ='port'),{'const':None,'help':'服务器端口','option_strings':['--port'],'dest':'port',' ''','选项':无,'default':8003,'container':< argparse._ArgumentGroup object at 0x7f9a8b3e6250> ;,'type':< type'int'> ;'metavar':'port'},< argparse.HelpFormatter对象在0x7f9a8b30a0d0>,< argparse._Section对象在0x7f9a8b30a110> ;, {'items':[],'formatter':< argparse.HelpFormatter object at 0x7f9a8b30a0d0>'heading':None,'parent':None},[],{'_current_indent':0,'_level':0,'_indent_increment':2,'_action_max_length':0'_max_help_position' '_width':78,'_root_section':< argparse._Section对象在0x7f9a8b30a110&g '_prog':'prout.py','_current_section':< argparse._Section object at 0x7f9a8b30a110> ;,'_whitespace_matcher':< _sre.SRE_Pattern对象在0x7f9a8b347750>}]

我无法在argparse中找到任何此类问题的报告,我做错了什么?

解决方案

gc.set_debug(gc.DEBUG_LEAK)

相当于说

  gc.set_debug(gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_SAVEALL)

通过设置 DEBUG_SAVEALL


设置时,找到的所有不可访问的对象都将追加到垃圾中,而不是被释放。

事实上,如果你没有设置 DEBUG_LEAK ,这些被释放。 (尝试你的代码,不需要设置 DEBUG_LEAK

你可能需要的标志是 gc.DEBUG_UNREACHABLE ,其中显示信息关于无法访问的对象(应该可以被释放),但不能被垃圾收集器释放。



你也可以看看 DEBUG_COLLECTABLE 帮助识别可以释放的循环引用。


I'm trying to debug a memory leak in a python application and I can see a lot of non collected object belonging to the module argparse

Here a minimal script reproducing the error

import gc
gc.set_debug(gc.DEBUG_LEAK)

def get_cli_arguments():
    import argparse
    parser = argparse.ArgumentParser(description='Launch a RHM server')
    parser.add_argument(
        '--port',
        metavar='port',
        type=int,
        nargs='?',
        help='the server port',
        default=8003
    )
    return vars(parser.parse_args())


def main():
    args = get_cli_arguments()
    x = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"


main()
gc.collect()
print(gc.garbage)

and I got the following output

gc: collectable <dict 0x7f9a8b303c58>
gc: collectable <dict 0x7f9a8b303d70>
gc: collectable <list 0x7f9a8b350ea8>
gc: collectable <list 0x7f9a8b350b00>
gc: collectable <list 0x7f9a8b3dca70>
gc: collectable <_ArgumentGroup 0x7f9a8b3e6250>
gc: collectable <dict 0x7f9a8b301910>
gc: collectable <list 0x7f9a8b3535a8>
gc: collectable <list 0x7f9a8b3e1758>
gc: collectable <function 0x7f9a8b3d2d70>
gc: collectable <dict 0x7f9a8b301a28>
gc: collectable <list 0x7f9a8b3e17e8>
gc: collectable <_HelpAction 0x7f9a8b3e60d0>
gc: collectable <dict 0x7f9a8b3014b0>
gc: collectable <HelpFormatter 0x7f9a8b2f7f90>
gc: collectable <_Section 0x7f9a8b2f7fd0>
gc: collectable <dict 0x7f9a8b3016e0>
gc: collectable <list 0x7f9a8b350248>
gc: collectable <dict 0x7f9a8b3015c8>
gc: collectable <dict 0x7f9a8b303e88>
gc: collectable <list 0x7f9a8b3e1d40>
gc: collectable <_StoreAction 0x7f9a8b30a090>
gc: collectable <dict 0x7f9a8b2f9c58>
gc: collectable <HelpFormatter 0x7f9a8b30a0d0>
gc: collectable <_Section 0x7f9a8b30a110>
gc: collectable <dict 0x7f9a8b3017f8>
gc: collectable <list 0x7f9a8b36c200>
gc: collectable <dict 0x7f9a8b301b40>
[{'action': {'store_false': <class 'argparse._StoreFalseAction'>, 'append_const': <class 'argparse._AppendConstAction'>, 'help': <class 'argparse._HelpAction'>, None: <class 'argparse._StoreAction'>, 'store_true': <class 'argparse._StoreTrueAction'>, 'count': <class 'argparse._CountAction'>, 'store_const': <class 'argparse._StoreConstAction'>, 'version': <class 'argparse._VersionAction'>, 'store': <class 'argparse._StoreAction'>, 'parsers': <class 'argparse._SubParsersAction'>, 'append': <class 'argparse._AppendAction'>}, 'type': {None: <function identity at 0x7f9a8b3d2d70>}}, {'store_false': <class 'argparse._StoreFalseAction'>, 'append_const': <class 'argparse._AppendConstAction'>, 'help': <class 'argparse._HelpAction'>, None: <class 'argparse._StoreAction'>, 'store_true': <class 'argparse._StoreTrueAction'>, 'count': <class 'argparse._CountAction'>, 'store_const': <class 'argparse._StoreConstAction'>, 'version': <class 'argparse._VersionAction'>, 'store': <class 'argparse._StoreAction'>, 'parsers': <class 'argparse._SubParsersAction'>, 'append': <class 'argparse._AppendAction'>}, [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port')], [], [], <argparse._ArgumentGroup object at 0x7f9a8b3e6250>, {'_mutually_exclusive_groups': [], '_negative_number_matcher': <_sre.SRE_Pattern object at 0x7f9a8b437290>, 'description': None, '_option_string_actions': {'--port': _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port'), '-h': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), '--help': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)}, 'title': 'optional arguments', '_has_negative_number_optionals': [], '_defaults': {}, 'prefix_chars': '-', 'argument_default': None, '_registries': {'action': {'store_false': <class 'argparse._StoreFalseAction'>, 'append_const': <class 'argparse._AppendConstAction'>, 'help': <class 'argparse._HelpAction'>, None: <class 'argparse._StoreAction'>, 'store_true': <class 'argparse._StoreTrueAction'>, 'count': <class 'argparse._CountAction'>, 'store_const': <class 'argparse._StoreConstAction'>, 'version': <class 'argparse._VersionAction'>, 'store': <class 'argparse._StoreAction'>, 'parsers': <class 'argparse._SubParsersAction'>, 'append': <class 'argparse._AppendAction'>}, 'type': {None: <function identity at 0x7f9a8b3d2d70>}}, '_group_actions': [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port')], '_action_groups': [], 'conflict_handler': 'error', '_actions': [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port')]}, [], [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port')], <function identity at 0x7f9a8b3d2d70>, {None: <function identity at 0x7f9a8b3d2d70>}, ['-h', '--help'], _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), {'const': None, 'help': 'show this help message and exit', 'option_strings': ['-h', '--help'], 'dest': 'help', 'required': False, 'nargs': 0, 'choices': None, 'default': '==SUPPRESS==', 'container': <argparse._ArgumentGroup object at 0x7f9a8b3e6250>, 'type': None, 'metavar': None}, <argparse.HelpFormatter object at 0x7f9a8b2f7f90>, <argparse._Section object at 0x7f9a8b2f7fd0>, {'items': [], 'formatter': <argparse.HelpFormatter object at 0x7f9a8b2f7f90>, 'heading': None, 'parent': None}, [], {'_current_indent': 0, '_level': 0, '_indent_increment': 2, '_action_max_length': 0, '_max_help_position': 24, '_width': 78, '_root_section': <argparse._Section object at 0x7f9a8b2f7fd0>, '_long_break_matcher': <_sre.SRE_Pattern object at 0x7f9a8b33e258>, '_prog': 'prout.py', '_current_section': <argparse._Section object at 0x7f9a8b2f7fd0>, '_whitespace_matcher': <_sre.SRE_Pattern object at 0x7f9a8b347750>}, {'--port': _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port'), '-h': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), '--help': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)}, ['--port'], _StoreAction(option_strings=['--port'], dest='port', nargs='?', const=None, default=8003, type=<type 'int'>, choices=None, help='the server port', metavar='port'), {'const': None, 'help': 'the server port', 'option_strings': ['--port'], 'dest': 'port', 'required': False, 'nargs': '?', 'choices': None, 'default': 8003, 'container': <argparse._ArgumentGroup object at 0x7f9a8b3e6250>, 'type': <type 'int'>, 'metavar': 'port'}, <argparse.HelpFormatter object at 0x7f9a8b30a0d0>, <argparse._Section object at 0x7f9a8b30a110>, {'items': [], 'formatter': <argparse.HelpFormatter object at 0x7f9a8b30a0d0>, 'heading': None, 'parent': None}, [], {'_current_indent': 0, '_level': 0, '_indent_increment': 2, '_action_max_length': 0, '_max_help_position': 24, '_width': 78, '_root_section': <argparse._Section object at 0x7f9a8b30a110>, '_long_break_matcher': <_sre.SRE_Pattern object at 0x7f9a8b33e258>, '_prog': 'prout.py', '_current_section': <argparse._Section object at 0x7f9a8b30a110>, '_whitespace_matcher': <_sre.SRE_Pattern object at 0x7f9a8b347750>}]

I can't find any report of such a problem in argparse, am I doing something wrong?

解决方案

This line

gc.set_debug(gc.DEBUG_LEAK)

Is equivalent to saying

gc.set_debug(gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_SAVEALL)

And by setting DEBUG_SAVEALL,

When set, all unreachable objects found will be appended to garbage rather than being freed.

In fact, these would have been freed, had you not set DEBUG_LEAK. (Try your code it without setting DEBUG_LEAK)

The flag you likely want is gc.DEBUG_UNREACHABLE, which displays information about objects that are unreachable (and should probably be freed) but cannot be freed by the garbage collector.

You could also look at DEBUG_COLLECTABLE to help identify circular references that can be freed.

这篇关于Python argparse出现在gc.garbage中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆