PyObjC应用程序不允许访问辅助功能API

时间:2014-01-25 05:56:26

标签: python cocoa cx-freeze pyobjc

在OSX Maverick上,我有这个基于PyObjC(python3.3)的简单APP

test.py

class MyDelegate(NSObject):

def applicationDidFinishLaunching_(self, sender):
    NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, lambda event: NSLog("hello"))
    NSApp.activateIgnoringOtherApps_(YES)

delegate = MyDelegate.alloc().init()
app = NSApplication.sharedApplication()
app.setDelegate_(delegate)

menu = NSMenu.alloc().initWithTitle_("My Menu")
app.setMainMenu_(menu)

window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
    NSMakeRect(0, 0, 100, 100),
    NSTitledWindowMask,
    NSBackingStoreBuffered,
    NO
)

window.setTitle_("my app")
window.makeKeyAndOrderFront_(None)

windowController = NSWindowController.alloc().initWithWindow_(window)


AppHelper.runEventLoop()

把它拉出来

python3 test.py

并在系统偏好设置中提供对终端的辅助功能访问 - >隐私与安全安全 - >辅助功能

我可以看到全局监视器工作。

然后我用cx_Freeze

冻结了它
python3 setup.py bdist_mac

最终以

结束
build/Test.app

open build/Test.app

我在OSX系统日志中看到错误

universalAccessAuthWarn[546]: AccessibilityAPI: pid 3809, is not allowed to access the accessibility API. Path: /path/to/build/Test.app/Contents/MacOS/test

我已启用“系统偏好设置”中的“测试”访问权限 - > “隐私与安全” - > “辅助功能”不起作用。

我在这里缺少什么?

更新: 可能是cx_Freeze的问题,使用py2app(0.8)使全局事件监视器工作。感谢Ronald Oussoren的提示(见下面的回答和评论)。

1 个答案:

答案 0 :(得分:2)

我不知道为什么这不适用于cx_Freeze,使用此setup.py文件使用py2app对我有用:

from setuptools import setup

setup(
    name='main',
    app=['test.py'],
    setup_requires=['py2app'],
)

也就是说,当我启动应用程序时,为其提供辅助功能访问权限,然后重新启动应用程序,我看到从Console.app中的应用程序进行日志记录。