Python PyObjC是否能够引入.bridgesupport文件中描述的*all*C函数?
查看PyObjC,我发现有一些支持从框架中的*.bridgesupport文件(即Python PyObjC是否能够引入.bridgesupport文件中描述的*all*C函数?,python,objective-c,pyobjc,Python,Objective C,Pyobjc,查看PyObjC,我发现有一些支持从框架中的*.bridgesupport文件(即objc模块中的\u setupcflasses)中引入对CF Objective-C桥接类型进行操作的C API函数 我好奇的是,是否有人实现了对*.bridgesupport文件中所有C函数的支持。例如,如果我尝试拉入IOKit.framework,方法如下: import objc as _objc foo = _objc.initFrameworkWrapper("IOKit",
objc
模块中的\u setupcflasses
)中引入对CF Objective-C桥接类型进行操作的C API函数
我好奇的是,是否有人实现了对*.bridgesupport文件中所有C函数的支持。例如,如果我尝试拉入IOKit.framework,方法如下:
import objc as _objc
foo = _objc.initFrameworkWrapper("IOKit",
frameworkIdentifier="com.apple.framework.IOKit",
frameworkPath=_objc.pathForFramework("/System/Library/Frameworks/IOKit.framework"),
globals=globals())
很明显,它使用的是IOKit.framework中包含的桥接支持文件——我最终将该桥接支持文件中声明的所有常量放入globals
——但我似乎没有得到太多其他内容,可能是因为PyObjC正在寻找Objective-C类声明,而没有找到任何。该bridgesupport文件包含所有IOKitLib C函数(如IORegistryEntryFromPath
等)的描述,其中许多函数接受和/或返回各种CFTYPE(其中一些被桥接为Objective-C类型)
我想编写一个Python脚本来调用其中一些IOKit函数,结果我使用了ctypes
模块,并指定了argtypes
和restype
等,这很有效,但在与Objective-C类型集成方面失败了。以ioRegistryEntryCreateCProperties
为例:
# set up the types
mach_port_t = ctypes.c_long;
io_registry_entry_t = mach_port_t;
iokit = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/IOKit.framework/IOKit')
iokit.IORegistryEntryCreateCFProperties.argtypes = [io_registry_entry_t, ctypes.POINTER(ctypes.c_void_p), ctypes.c_void_p, ctypes.c_uint32 ]
iokit.IORegistryEntryCreateCFProperties.restype = ctypes.c_int
# Call it
propDict = ctypes.c_void_p()
iokit.IORegistryEntryCreateCFProperties(regEntry, propDict, 0, 0)
这很好,propDict现在是一个指向CFMutableDictionaryRef
的指针,但我不能在Python中使用它,就像我不能在PyObjC代理的调用中使用NSDictionary
一样(在我的脚本中,我引入了使用ctypes
所需的所有C API)。我看到了PyObjC的更新版本(暂时忽略这一功能在MacOS附带的PyObjC版本中似乎不存在),但我真正想要的是(你知道,除了一匹小马之外)所有这些东西,包括函数本身,都被“缝合”通过读取和集成*.bridgesupport文件的进程
我是一名Python爱好者(但我是一名ObjC老手),因此我认识到这可能是一项非常重要的功能来实现,而且我还可以看出,有人怎么会认为它不在PyObjC的权限范围内(因为所讨论的API是一个直C API,只有一些方法采用/返回桥接CFTYPE),但这似乎也是合乎逻辑的,所以在我花大量时间尝试这么做(同时学习Python)之前,我想在这里问一下,看看是否有人已经这么做了(或者在这个主题上有任何其他热门想法)。该系统包括PyObjC.bridgesupport文件,这是众所周知的落后于库本身的。现有的桥接器支持文件是否确实提到了您希望包含的功能?您是否尝试过用丢失的信息创建自己的版本(通过编辑原始版本)?IIRC,PyObjC应该更喜欢IOKit.bridgesupport的本地版本(与脚本相同的目录)而不是系统版本。我的两个老答案可能会为您提供一些关于编辑桥梁支撑数据的有用信息:,