pydoc可以在pyd上操作吗,或者有没有与pydoc等效的操作pyd的程序



在我看来,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。它并不那么简单,因为它不太常见。

最新更新