看看PyObjC我看到有一些支持用于引入在CF< - >上运行的C API函数。 Objective-C桥接来自框架中* .bridgesupport文件的类型(即_setupCFClasses
模块中的objc
。)
我很好奇的是,是否有人实现了对* .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中包含的桥接支持文件 - 我最终将在将bridgeupport文件中声明的所有常量放入globals
- 但它似乎不像我得到更多其他东西,大概是因为PyObjC正在寻找Objective-C类声明,而没有找到任何。 bridgesupport文件包含所有IOKitLib C函数(如IORegistryEntryFromPath
等)的描述,其中许多函数接受和/或返回各种CFType(其中一些CFType桥接到Objective-C类型)。
我想创建一个调用其中一些IOKit函数的Python脚本,最后我使用了ctypes
模块,并指定了argtypes
和restype
等等。工作,但它与Objective-C类型的集成下降。以IORegistryEntryCreateCFProperties
为例:
# 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中使用它,就像我可以{PyperbjC斡旋的NSDictionary
一样(在我的脚本中我最终引入了使用ctypes
)完成所需操作所需的所有C API。我看到更新版本的PyObjC have support for creating PyObjC wrappers from a c_void_p
(暂时忽略了这个功能似乎不是出自MacOS的PyObjC版本),但是我真的很喜欢(你知道,除了pony)用于所有这些东西,包括函数本身,由读取和集成* .bridgesupport文件的进程“缝合”。
我是Python业余爱好者(但是ObjC的老手),所以我认识到这可能是一个非常重要的功能来实现,我也可以看到它是如何被认为它超出了PyObjC的范围(因为有问题的API是一个直接的C API,只有一些方法采用/返回桥接CFTypes),但它似乎也是合理的事情,所以在我花费大量时间尝试这样做之前(同时学习Python),我想我会问这里,看看是否有人已经做过(或者对这个主题有任何其他热点想法。)