我正在尝试从windows dll创建一堆python函数,并希望将docstrings附加到每个新函数。
我目前的代码:
import ctypes
lib=ctypes.WinDLL('example.dll')
VCS_OpenDevice=lib['VCS_OpenDevice']
VCS_OpenDevice.restype=ctypes.c_double
当我在我的解释器中运行此脚本并尝试使用该函数时,我收到'no docstring'消息。
无法想出在那里添加东西。任何帮助表示赞赏。
答案 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)
>>>