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
如果您在 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