将文档字符串添加到使用ctypes从dll中提取的python函数

时间:2013-01-08 20:34:23

标签: python dll ctypes docstring

我正在尝试从windows dll创建一堆python函数,并希望将docstrings附加到每个新函数。

我目前的代码:

import ctypes

lib=ctypes.WinDLL('example.dll')

VCS_OpenDevice=lib['VCS_OpenDevice']
VCS_OpenDevice.restype=ctypes.c_double

当我在我的解释器中运行此脚本并尝试使用该函数时,我收到'no docstring'消息。

无法想出在那里添加东西。任何帮助表示赞赏。

enter image description here

2 个答案:

答案 0 :(得分:3)

分配__doc__函数指针的ctypes属性:

VCS_OpenDevice.__doc__ = 'My docstring'

__doc__是Python对象的docstring属性,ctypes对象允许您写入此属性。

强制性libc演示(我使用的是Mac,不是Windows,但原理是一样的):

>>> from ctypes import *
>>> libc = cdll.LoadLibrary("libc.dylib") 
>>> libc.time.__doc__ = 'time -- get time of day'
>>> print libc.time.__doc__
time -- get time of day

IPython似乎能够很好地选择它:

In [4]: libc.time?
Type:       _FuncPtr
String Form:<_FuncPtr object at 0x1054b8ef0>
File:       /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py
Docstring:  time -- get time of day

答案 1 :(得分:0)

但是我想使用help()!!!!!

因此,我没有赢得生活的不公平,而是创建了help_support 导入时将允许您使用已记录的ctypes函数和结构的帮助的模块。 它还允许您记录其他内容,例如ctypes函数参数的名称,它们也会显示出来。

https://pypi.org/project/help-support/0.2/

如果您要进行Python绑定,请包含help_support.py并将其导入,以使像我这样的脚底不好的人可以更快地使用自己的库进行开发。

真正的文档给A带来了痛苦,我对原始的Python控制台感到满意。

在通过从C扩展名向我的函数添加doc字符串做了明显的事情之后,在help()中看不到任何结果,并且在Internet上找不到任何解决方案,我简直无法忍受这种情况。 所以你来了。现在,您可以在从DLL提取的函数上使用help()(至少在Python 2中如此)。

这是一个例子:

# examp_module:
import ctypes
import ctypes.util

import help_support
del help_support # If you want you can remove it now
                 # to avoid cluttering your globals() namespace.
                 # Once it is called you do not usually need it any more.

l = ctypes.CDLL(ctypes.util.find_library("c"))

# Pull the time() function from libc,
# declare and document it:
time = l.time
time.argtypes = []
#time.argnames = ["c_void"] # The function takes no arguments, but you can trick help_support 
                            # to show something in parenthesis if you want to be consistent with C
                            # If there is/are argument(s) you should put its/their name(s) in "argnames".
time.restype = ctypes.c_int
time.__doc__ = "Function that returns a system time in seconds."
-------------------------------------------
>>> # Usage:
>>> import examp_module
>>> help(examp_module)
>>> help(examp_module.time)
>>>