繁体   English   中英

如何打印Python中“__main__”的帮助说明?

[英]How Can I Print The Help Description Of “__main__” In Python?

对于导入的模块,在解释器中调用help(<module_name>)将打印模块的描述; 通常,这是一个文档字符串,但如果模块以注释开头,它将作为描述传递。 在未导入的脚本中(即任何具有__name____main__的脚本),调用print(__doc__)将给出类似的结果——但前提是存在文档字符串; 它不会像help()那样拉任何评论。

那么如何在脚本本身上调用help()并获取描述,尤其是在没有正确的文档字符串但只有注释的情况下?

您可以使用该模块作为sys.modules['__main__']可用的事实:

"""
Is this what you want?
"""
import sys

if __name__ == '__main__':
    help(sys.modules['__main__'])

输出

Help on module __main__:

NAME
    __main__ - Is this what you want?

DATA
    __annotations__ = {}

FILE
    /Users/akx/Desktop/so61453557.py

(END)

或者,对于没有文档字符串但有注释的文件:

# This is
# the description
# and not even a haiku

import sys

if __name__ == '__main__':
    help(sys.modules['__main__'])
Help on module __main__:

NAME
    __main__

DESCRIPTION
    # This is
    # the description
    # and not even a haiku

DATA
    __annotations__ = {}

FILE
    /Users/akx/Desktop/so61453557.py

(END)

编辑

好的,这比我想象的更有趣,并且深入研究了 CPython 内部!

python -i so61453557.pypython -m so61453557在这里的行为不同。

前者调用pymain_run_file() ,后者调用PyRun_AnyFileExFlags() ,后者调用PyRun_SimpleFileExFlags() 据我所知,它基本上合成了一个__main__模块并使用PyRun_FileExFlags在该上下文中评估文件。

后者调用pymain_run_module() ,其真正的逻辑包含在 stdlib runpy.py模块( _run_module_as_main )中。

在那之后,

-i被设置( interactiveinspect )时, pymain_repl()被调用,如果设置了它可能会调用一个交互式钩子(例如 readline 完成和东西),然后调用PyRun_AnyFileFlags(stdin, "<stdin>", cf)

我不知道在文件运行后清除__main__的内容(可能是 PyRun_SimpleFileExFlags 末尾的PyRun_SimpleFileExFlags XDECREF() ),但这里有一些结论。

  • python -i -m so61453557似乎保留了__main__<module '__main__' from 'so61453557.py'> ),因此您可以按照 REPL 中的预期运行help(sys.modules['__main__'])
  • python -i so61453557.py :当进入 REPL 时,__ __main__模块恢复为<module '__main__' (<_frozen_importlib_external.SourceFileLoader object at 0x10fb2e990>)>
  • python有第三个版本的__main__<module '__main__' (built-in)>

作为一个黑客,我认为可以sys.modules['hack'] = sys.modules['__main__'] ,但这不起作用; 模块本身正在更改,并且模块对象无法腌制,因此您也无法分配copy.copy(main)

但是, TL;DR:如果您使用python -i -m something ,则此方法有效,如果您使用 python -i something.py 则python -i something.py

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM