eclipse自带的argparse模板的main函数在interactivepythonshell中是如何工作的?

How does the main function of the argparse template that ships with eclipse work in the interactive python shell?

如果您在 eclipse 中创建一个新的 python 模块,您可以选择为您的新模块使用 argparse 模板。以下是此模板的代码片段。

#!/usr/local/bin/python2.7
# encoding: utf-8
'''
eclipse_argparse -- shortdesc

eclipse_argparse is a description

It defines classes_and_methods

@author:     user_name

@copyright:  2015 organization_name. All rights reserved.

@license:    license

@contact:    user_email
@deffield    updated: Updated
'''
def main(argv=None): # IGNORE:C0111
    '''Command line options.'''

    if argv is None:
        argv = sys.argv
    else:
        sys.argv.extend(argv)

...

    program_shortdesc = __import__('__main__').__doc__.split("\n")[1]

...

if __name__ == "__main__":
    sys.exit(main())

'...' 表示我省略了代码中对我的问题似乎不重要的部分。 我将文件保存在 eclipse_argparse.py 下。 据我了解,main 函数被赋予参数 argv 以便可以从 python shell 交互调用主函数并为其提供参数:

>>> import eclipse_argparse
>>> eclipse_argparse.main('-bla')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "eclipse_argparse.py", line 57, in main
    program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
AttributeError: 'NoneType' object has no attribute 'split'

但这是不可能的,因为 __import__('__main__') 的计算结果为 __main__,而不是我期望的 eclipse_argparse

program_shortdesc 应评估为 eclipse_argparse -- shortdesc

为什么会这样?我的假设是,您应该能够在交互式会话中使用参数调用 main 方法是错误的吗?

在一个模块中,它自己的文档以 __doc__ 的形式提供。您不需要导入任何东西,或引用 __main__(在交互式 shell 中指向 shell 环境,而不是任何导入的模块)。

这在从 if __name__ 和 shell 调用 main 时起作用:

def main(argv=None): # IGNORE:C0111
    # ...
    print __doc__

在shell我可以做到:

>>> import stack27864002
>>> stack27864002.__doc__
'\neclipse_argparse -- ...'
>>> stack27864002.main()
# same

我想知道为什么它被称为 argparse template,因为它与 argparse.py 模块无关。

__doc__ 的默认值为 None,因此最好为这种情况做好准备 - 即不要在未先检查的情况下尝试拆分它。

要使代码在交互式 shell 会话中工作,代码

program_shortdesc = __import__('__main__').__doc__.split("\n")[1]

应改为:

if __name__ == '__main__':
        program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
    else:
        program_shortdesc = __doc__.split("\n")[1]

让我感到困惑的是,他们提供了一个可以提供参数的主要方法(这意味着您可以在 python shell 中导入模块并使用一些参数调用主函数参数,如 import eclipse_argparse; eclipse_argparse.main('-some_parameter')),然后定义一个变量 program_shortdesc,只有当你通过 '__main__' 'entry point' 调用程序时才有效,如 python eclipse_argparse.py