在我看来,pydoc只适用于py源代码文件。
它能以某种方式用于已编译的pyd文件吗?我在尝试时遇到的错误是
ValueError: source code string cannot contain null bytes
这显然是由于编译后的pyd包含NUL字节这一事实而产生的。
查看pydoc
库,特别是其源代码(3.9(,函数importfile
可与.py和.pryc一起使用,但不与.pyo或.myd文件一起使用。
可以编写自定义代码来解析.pyd文件的内容,并重用pydoc
的部分内容来生成文档,但我认为这并不简单。
另一种方法是通过调用pydoc
的内置help
。这里有一个概念证明:
# file: main.py
"""
Hello pydoc !
"""
# file: setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("main", ["main.py"]),
]
setup(
name='My pyd file',
cmdclass={'build_ext': build_ext},
ext_modules=ext_modules
)
(我在我的venv中安装了Cython,这样我就可以将.py文件编译成.pryd(
我运行python setup.py build_ext --inplace
,它生成main.cp36-win_amd64.pyd
文件
我将此文件移到另一个目录中(以免以后导入时出错(,然后使用此文件:
# file: get_pydoc.py
import main
if __name__ == "__main__":
help(main)
它与.pyd文件在同一目录中(没有其他内容(。运行时,它会打印:
Help on module main:
NAME
main - Hello pydoc !
DATA
__test__ = {}
FILE
c:\pycharmprojectsstack_overflowq68002833_checkmain.cp36-win_amd64.pyd
这证明了这是可能的。
看看3.9版help
的CPython实现,我们可以看到它只执行return pydoc.help(*args, **kwds)
。所以我们可以直接调用pydoc
:
# file: get_pydoc.py
import pydoc
import main
if __name__ == "__main__":
pydoc.help(main)
并且仍然具有相同的输出。
但是它直接在stdout上打印输出,这并不方便。看看它的Cpython 3.9实现,它默认使用它的output
字段,如果没有向构造函数提供output
,这是一个返回sys.stdout
的属性(请参阅此处(,默认Helper
就是这样。
因此,通过构造一个新的Helper
对象,其输出是内存中的io.StringIO
,我们得到以下代码:
# file: get_pydoc.py
import io
import pydoc
import main
if __name__ == "__main__":
doc_content = io.StringIO()
helper = pydoc.Helper(output=doc_content)
helper.help(main)
print(doc_content.getvalue())
我认为它回答了您的问题:您可以编写一个脚本,从.pyd文件中获取pydoc。它并不那么简单,因为它不太常见。