为什么我不能从我的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() 
+0

这可能是一个权限问题:http://www.mail-archive.com/[email protected]/msg27379.html – kevingessner 2010-09-13 21:46:26

你不能(通常)从没有关联到一个GUI用户进程连接到窗口服务器。看到这个Apple tech note。 基本上,从Apache产生的进程中使用NSWindow等是个不错的选择。如果没有GUI用户登录,窗口服务器甚至不能保证存在。所以,你无法可靠地做你想做的事情。

问题是,随OS X附带的WebKit依赖于窗口服务器。一种出路可能是安装Qt,希望有一个独立于Core Graphics窗口服务器的WebKit后端。

+0

我明白了。我打算在没有人登录的情况下在XServe上运行它,所以你是对的,听起来不太合适。我会看看Qt的WebKit包装器。谢谢! – 2010-09-14 17:49:29