为什么我不能使用Python脚本中的Cocoa类?

时间:2010-09-13 21:41:14

标签: python cocoa macos nswindow

今天是我第一次使用Python,所以我确信这将是一个简单的问题。

我需要从命令行应用程序转换此Python脚本:webkit2png。最终结果将是一个URL,它返回作为查询字符串参数传递给它的网页的图像。我已经在Windows上使用.NET和IE,Gecko和WebKit实现了这一点,但现在需要对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()

1 个答案:

答案 0 :(得分:2)

您不能(通常)从与GUI用户无关的进程连接到窗口服务器。见Apple tech note。 基本上,在Apache产生的过程中使用NSWindow等是一个很大的禁忌。如果没有GUI用户登录,则甚至不保证窗口服务器存在。因此,您无法可靠地执行您想要执行的操作。

问题在于OS X附带的WebKit取决于窗口服务器。一种方法可能是安装Qt,希望它有一个独立于Core Graphics窗口服务器的WebKit后端。