【问题标题】:Calling function with ctypes or pyObjc使用 ctypes 或 pyObjc 调用函数
【发布时间】: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'

这是pyObjcIOKit.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

任何人都可以指出我的方向:

  1. 将浮点指针传递给pyObjc 包装函数?
  2. 使用ctypes呼叫IODisplayGetFloatParameter?

【问题讨论】:

    标签: python macos pointers ctypes pyobjc


    【解决方案1】:

    这里的问题是桥支持文件不完整(很遗憾,大多数系统桥支持文件都是如此)。

    下面的代码更有用地公开了这个函数:

    import objc
    
    bundle = objc.loadBundle('IOKit', bundle_path='/System/Library/Frameworks/IOKit.framework', module_globals=globals())
    objc.objc.loadBundleFunctions(bundle, globals(), [
        (
            'IODisplayGetFloatParameter',
            objc._C_INT + objc._C_UINT + objc._C_NSUInteger + objc._C_ID + objc._C_PTR + objc._C_FLT,
            '',
            { 'arguments': { 3: { 'type_modifier': b'n' }}} ),
    ])
    print(IODisplayGetFloatParameter.__metadata__())
    

    这假定 IODisplayGetFloatParameter 通过引用返回单个浮点值。

    另请参阅:https://pythonhosted.org/pyobjc/metadata/manual.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多