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