Почему я не могу использовать классы Какао из моего скрипта Python? - PullRequest
1 голос
/ 14 сентября 2010

Сегодня я впервые использую Python, поэтому я уверен, что это будет простой вопрос.

Мне нужно преобразовать этот скрипт Python из приложения командной строки: webkit2png.Конечным результатом будет URL-адрес, который возвращает изображение веб-страницы, переданной в него в качестве параметра строки запроса.Я добился этого в Windows с помощью .NET и IE, Gecko и WebKit, но теперь нужно сделать то же самое для Safari на OS X.

Я думаю, что я его преобразовал, но, к сожалению, явозникла проблема с запуском скрипта из Apache на OS X:

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 Ответ

2 голосов
/ 14 сентября 2010

Вы не можете (обычно) подключаться к серверу окон из процесса, не связанного с пользователем графического интерфейса.См. Техническая записка Apple .По сути, это большой отказ от использования NSWindow и т. Д. Из процесса, порожденного Apache.Оконный сервер даже не гарантированно существует, если не зарегистрирован пользователь GUI. Таким образом, вы не можете надежно делать то, что вы пытаетесь сделать.

Проблема в том, что WebKit, который поставляется с OS Xзависит от оконного сервера.Одним из выходов может быть установка Qt, который, как мы надеемся, имеет бэкэнд WebKit, независимый от сервера окон Core Graphics.

...