【发布时间】:2019-01-22 13:20:50
【问题描述】:
我想从 Python 调用 IOKit 框架。
这是我要调用的 Objective-C 函数的签名:
IOReturn IODisplayGetFloatParameter(io_service_t service, IOOptionBits options, CFStringRef parameterName, float *value);
使用pyObjc,导入后,我会这样做:
brightness = 0.0
IODisplayGetFloatParameter(service, 0, kIODisplayBrightnessKey, brightness)
但是,我收到此错误:
ValueError: depythonifying 'pointer', got 'float'
这是pyObjc 在IOKit.IODisplayGetFloatParameter() 上生成句柄的 BridgeSupport 文件的相关位:
<function name='IODisplayGetFloatParameter'>
<arg type='I'/>
<arg type='L' type64='I'/>
<arg type='^{__CFString=}'/>
<arg type='^f'/>
<retval type='i'/>
这让我相信我需要创建一个 pyObjc 对象,该对象代表一个指向 float 的指针,但我在查找相关文档时遇到了麻烦。
所以,我尝试使用ctypes,但它出现了段错误,因为我没有给它正确的argtypes,也没有将正确的值传递给函数。
from ctypes import CDLL, c_void_p, byref, c_char_p, c_int, c_float, pointer, POINTER
from ctypes.utils import find_library
c_float_p = POINTER(c_float)
float_ptr = c_float_p(c_float(0.0))
IOKit = CDLL(find_library('IOKit'))
IOKit.IODisplaySetFloatParameter.argtypes = [c_int, c_int, c_char_p, c_float_p]
IOKit.IODisplaySetFloatParameter(service_goes_here, 0, "brightness", float_pointer)
Segmentation fault: 11
任何人都可以指出我的方向:
- 将浮点指针传递给
pyObjc包装函数? - 使用
ctypes呼叫IODisplayGetFloatParameter?
【问题讨论】:
标签: python macos pointers ctypes pyobjc