我正在尝试使用PyObjC的私有框架.到目前为止我有这个:
from AppKit import *
from Foundation import *
import objc
framework="/System/Library/PrivateFrameworks/DSObjCWrappers.framework"
objc.loadBundle("DSObjCWrapper", globals(), framework)
directory = DSoDirectory.alloc()
directory.initWithHost_user_password_("server", "diradmin", "password")
eDSStartsWith = 0x2002
node = directory.findNode_matchType_(u"/LDAPv3", eDSStartsWith)
Run Code Online (Sandbox Code Playgroud)
这很好.现在,我想在我的节点(类DSoNode)上调用一个方法,使用此objective-c签名.
最明显的方法是不知道如何获取字符串并将其传递给char*:
node.hasRecordsOfType_("dsRecTypeStandard:ComputerLists")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/Users/clinton/<ipython console> in <module>()
ValueError: depythonifying 'char', got 'str' of 31
Run Code Online (Sandbox Code Playgroud)
看起来可以在python看到它时更改签名.我尝试了一些变化:
objc.registerMetaDataForSelector("DSoNode", "hasRecordsOfType_", dict( arguments={ 2+0: dict(type_modifier='n', type='^C') }))
Run Code Online (Sandbox Code Playgroud)
但是 - 坦率地说我不知道registerMetaDataForSelector函数是如何工作的,并且还没有找到文档 - 当我在节点上调用我的选择器时,我仍然会得到相同的错误.如何告诉PyObjC将字符串转换为char*?(或者有更好的方法,因为这些字符串是头文件中的C常量#defined.)
更新:我尝试使用gen_bridge_metadata(如本博文中所述),并在查阅手册页后,尝试如下:
sudo mkdir -p /System/Library/PrivateFrameworks/DSObjCWrappers.framework/Resources/BridgeSupport
sudo gen_bridge_metadata --framework ~/Downloads/DSTools-112.1/build/Deployment/DSObjCWrappers.framework/ …Run Code Online (Sandbox Code Playgroud) 如果你这样做了,你介意分享你如何安装pyobjc吗?我试图通过安装PythonMac 2.5(通过py2app的独立包)和easy_installPyObjC来实现.我总是得到那些deprecated错误,主要是那些在dyld.h里面和内部声明的错误objc_inject.m.
我尝试从源代码编译,但仍然没有运气.
此外,当我在Snow Leopard下运行我的Leopard编译的PyObjC应用程序时,它有关于PyObjC的错误,第一次是它无法看到,Foundation或者AppKit第二次typestr是未知的.
谢谢,感谢您的回答.
我正在尝试使用Growl Python绑定(来自Growl存储库的Growl.py v0.7)来编写一个小应用程序.目前缺少的一个功能是发送给Python的点击通知.
我知道在Objective-C中,当用户点击通知时,它会向正在运行的应用程序发送一个触发器.我想用Python绑定做类似的事情.当用户点击通知时,我希望Python程序在浏览器中打开一个URL(或以另一种方式处理事件).
有关如何实现它的任何想法?
更新:感谢合成器配件提供了一个很有前途的解决方案,我认为它适用于Lion.不幸的是,我开始从Mac淡出,所以我不再做很多Mac编程了.虽然,我做了一些调试,因为它仍然没有在Snow Leopard上工作,这就是为什么:
我正在尝试使用Xcode的cocoa-python,但它总是调用错误:
Traceback (most recent call last):
File "main.py", line 10, in <module>
import objc
ImportError: No module named objc
Run Code Online (Sandbox Code Playgroud)
这似乎是因为我尝试安装或查找objc以及该文件使用的其他模块的所有尝试,它们根本就不在我的计算机上,我可以告诉,所以有人知道我可以在哪里下载实际文件(或者可以放他们自己的副本?)如objc.py,Foundation.py,AppKit.py和PyObjCTools.py?
官方文档说可以在python代码中使用自定义块,但是您需要创建元数据.我还没有找到它的一个例子.
我的问题是如何创建,使用和分发自定义块的元数据.
例
@interface SomeClass
- (void)doSomethingWithCompletion: (void (^)(SomeObject *obj, NSError *error))myBlock;
@end
def pythonMethod():
def completion(obj, error):
# staff
foo = SomeClass.new()
foo.doSomethingWithCompletion_(somehow_pass_completion)
Run Code Online (Sandbox Code Playgroud)
问题是somehow_pass_completion应该如何以及如何提供元数据myBlock.
Xcode最强大的功能之一就是它的Intellisense完成功能,它会在您输入Foundation/Cocoa/UIKit API的名称时显示潜在候选项列表.我对MacRuby,PyObjC或更新的RubyMotion非常感兴趣,但是如果没有代码完成,这些工具似乎比它们的价值更麻烦.
上述三种技术中的任何一种,对于任何文本编辑器(但最好是Vim或Xcode),是否有任何代码完成功能(不一定是Intellisense )?IDE解决方案的奖励点,允许在单个命令中构建和运行应用程序(如Xcode的"运行"按钮).
据我所知,Xcode 4放弃了对MacRuby/PyObjC的支持,因此Intellisense不再可用.为了完成代码,我应该在Xcode 4旁边安装Xcode 3吗?其他人如何做到这一点(当然你们使用某种形式的代码完成 - 我不相信任何人都能记住Foundation/Cocoa/UIKit中的所有类)?
我在Lion和NSNotification中心使用Python 2.7和pyobjc来监控任何插入的USB卷.这很好用.
我也有一些想法如何获取设备的序列号,但这些只涉及解析所有USB设备.我想专门查询插入的设备(创建通知的设备),而不是检查整个USB设备列表.
如何实现这一目标?NSNotification传递给我的处理函数的对象没有那种信息,我无法通过NSNotification对象提供的信息找到有关上述操作的任何信息.
我已经尝试过DBus(就像我在Linux上做的那样),但我没有太多运气让它在OSX上可靠地运行.
我想通过python连接到Mountain Lion通知中心.我已经安装了pyobjc,并按照这里和这里的说明操作.另请参阅:使用PyObjC与Mountain Lion的通知中心合作
这是我的代码:
import Foundation, objc
import AppKit
import sys
NSUserNotification = objc.lookUpClass('NSUserNotification')
NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
def notify(title, subtitle, info_text, delay=0, sound=False, userInfo={}):
""" Python method to show a desktop notification on Mountain Lion. Where:
title: Title of notification
subtitle: Subtitle of notification
info_text: Informative text of notification
delay: Delay (in seconds) before showing the notification
sound: Play the default notification sound
userInfo: a dictionary that can be used to handle clicks in your …Run Code Online (Sandbox Code Playgroud) python pyobjc nsnotificationcenter osx-mountain-lion nsusernotificationcenter