pydoc 可以在 pyd 上运行吗,或者是否有与 pydoc 等效的在 pyd 上运行的

Can pydoc operate on a pyd, or is there an equivalent to pydoc that operates on a pyd

在我看来,pydoc 只适用于 py 源代码文件。

它能以某种方式用于编译后的pyd文件吗?我在尝试时遇到的错误是

ValueError: source code string cannot contain null bytes

这显然是由于编译后的 pyd 包含 NUL 字节。

查看 pydoc library, specially its source code (3.9), the function importfile 适用于 .py.pyc,但不适用于 .pyo.pyd 文件。

也许可以编写自定义代码来解析 .pyd file 的内容并重新使用 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文件编译成.pyd)

I 运行 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:\pycharmprojects\stack_overflow\q68002833_check\main.cp36-win_amd64.pyd

证明这是可能的。

查看 CPython implementation for help as of 3.9 我们可以看到它只执行 return pydoc.help(*args, **kwds)。所以我们可以直接调用 pydoc :

# file: get_pydoc.py
import pydoc

import main

if __name__ == "__main__":
    pydoc.help(main)

并且仍然有相同的输出。

但是它直接在标准输出上打印它的输出,这很不方便。看看它的 Cpython 3.9 implementation that it uses by default its output field, which is a property (see here) that returns sys.stdout if no output has been provided to the constructor, which is the case for the default 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。它只是不那么简单,因为它不太常见。