2010-09-13 44 views
1

今天是我第一次使用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

回答

2

你不能(通常)從沒有關聯到一個GUI用戶進程連接到窗口服務器。看到這個Apple tech note。 基本上,從Apache產生的進程中使用NSWindow等是個不錯的選擇。如果沒有GUI用戶登錄,窗口服務器甚至不能保證存在。所以,你無法可靠地做你想做的事情。

問題是,隨OS X附帶的WebKit依賴於窗口服務器。一種出路可能是安裝Qt,希望有一個獨立於Core Graphics窗口服務器的WebKit後端。

+0

我明白了。我打算在沒有人登錄的情況下在XServe上運行它,所以你是對的,聽起來不太合適。我會看看Qt的WebKit包裝器。謝謝! – 2010-09-14 17:49:29

相關問題