![](/img/trans.png)
[英]How can I convert <class 'str'> into <class '__main__'> in Python
[英]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.py
和python -m so61453557
在这里的行为不同。
前者调用pymain_run_file()
,后者调用PyRun_AnyFileExFlags()
,后者调用PyRun_SimpleFileExFlags()
。 据我所知,它基本上合成了一个__main__
模块并使用PyRun_FileExFlags
在该上下文中评估文件。
后者调用pymain_run_module()
,其真正的逻辑包含在 stdlib runpy.py
模块( _run_module_as_main
)中。
在那之后,
当-i
被设置( interactive
, inspect
)时, 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.