为什么我不能从我的Python脚本中使用Cocoa类?
今天是我第一次使用Python,所以我相信这将是一个简单的问题。为什么我不能从我的Python脚本中使用Cocoa类?
我需要从命令行应用程序转换此Python脚本:webkit2png。最终结果将是一个URL,它返回传递给它的网页的图像作为查询字符串参数。我已经使用.NET和IE,Gecko和WebKit在Windows上实现了这一点,但现在需要为OS X上的Safari执行相同的操作。
我想我已经转换了它,但不幸的是我正在运行在OS X上运行Apache的脚本时出现问题:
app = AppKit.NSApplication.sharedApplication()
# create an app delegate
delegate = AppDelegate.alloc().init()
AppKit.NSApp().setDelegate_(delegate)
# create a window
rect = Foundation.NSMakeRect(0,0,100,100)
win = AppKit.NSWindow.alloc()
win.initWithContentRect_styleMask_backing_defer_ (rect,
AppKit.NSBorderlessWindowMask, 2, 0)
错误在最后一行“initWithContentRect ...”上抛出。我看到的错误是:
<class 'objc.error'>: NSInternalInconsistencyException - Error (1002) creating CGSWindow
args = ('NSInternalInconsistencyException - Error (1002) creating CGSWindow',)
message = 'NSInternalInconsistencyException - Error (1002) creating CGSWindow'
name = u'NSInternalInconsistencyException'
如果我在命令行(删除CGI的东西后)运行脚本,它运行完美。
这里是我导入库:
import cgi
import cgitb; cgitb.enable() # for troubleshooting
import sys
try:
import Foundation
import WebKit
import AppKit
import objc
except ImportError:
print "Cannot find pyobjc library files. Are you sure it is installed?"
sys.exit()
你不能(通常)从没有关联到一个GUI用户进程连接到窗口服务器。看到这个Apple tech note。 基本上,从Apache产生的进程中使用NSWindow
等是个不错的选择。如果没有GUI用户登录,窗口服务器甚至不能保证存在。所以,你无法可靠地做你想做的事情。
问题是,随OS X附带的WebKit依赖于窗口服务器。一种出路可能是安装Qt,希望有一个独立于Core Graphics窗口服务器的WebKit后端。
我明白了。我打算在没有人登录的情况下在XServe上运行它,所以你是对的,听起来不太合适。我会看看Qt的WebKit包装器。谢谢! – 2010-09-14 17:49:29
这可能是一个权限问题:http://www.mail-archive.com/[email protected]/msg27379.html – kevingessner 2010-09-13 21:46:26