gpt4 book ai didi

python - 从 Python 调用 Objective C 函数?

转载 作者:太空狗 更新时间:2023-10-29 19:31:14 29 4
gpt4 key购买 nike

有没有办法从 Python 动态调用 Objective C 函数?

例如,在 mac 上我想调用这个 Objective C 函数

[NSSpeechSynthesizer availableVoices]

无需预编译任何特殊的 Python 包装器模块。

最佳答案

正如其他人所提到的,PyObjC 是必经之路。但是,为了完整起见,这里是你如何使用 ctypes 来做到这一点。 ,以防你需要它在 10.5 之前的 OS X 版本上工作,但没有安装 PyObjC:

import ctypes
import ctypes.util

# Need to do this to load the NSSpeechSynthesizer class, which is in AppKit.framework
appkit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('AppKit'))
objc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('objc'))

objc.objc_getClass.restype = ctypes.c_void_p
objc.sel_registerName.restype = ctypes.c_void_p
objc.objc_msgSend.restype = ctypes.c_void_p
objc.objc_msgSend.argtypes = [ctypes.c_void_p, ctypes.c_void_p]

# Without this, it will still work, but it'll leak memory
NSAutoreleasePool = objc.objc_getClass('NSAutoreleasePool')
pool = objc.objc_msgSend(NSAutoreleasePool, objc.sel_registerName('alloc'))
pool = objc.objc_msgSend(pool, objc.sel_registerName('init'))

NSSpeechSynthesizer = objc.objc_getClass('NSSpeechSynthesizer')
availableVoices = objc.objc_msgSend(NSSpeechSynthesizer, objc.sel_registerName('availableVoices'))

count = objc.objc_msgSend(availableVoices, objc.sel_registerName('count'))
voiceNames = [
ctypes.string_at(
objc.objc_msgSend(
objc.objc_msgSend(availableVoices, objc.sel_registerName('objectAtIndex:'), i),
objc.sel_registerName('UTF8String')))
for i in range(count)]
print voiceNames

objc.objc_msgSend(pool, objc.sel_registerName('release'))

它不漂亮,但它完成了工作。可用名称的最终列表存储在上面的 voiceNames 变量中。

2012-4-28 更新:通过确保所有参数和返回类型作为指针而不是 32 位整数传递,已修复以在 64 位 Python 构建中工作。

关于python - 从 Python 调用 Objective C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1490039/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com