2010-09-13 5 views
1

Aujourd'hui c'est la première fois que j'utilise Python, donc je suis sûr que ce sera une question facile.Pourquoi ne puis-je pas utiliser les classes Cocoa de mon script Python?

J'ai besoin de convertir ce script Python à partir d'une application en ligne de commande: webkit2png. Le résultat final sera une URL qui renvoie une image de la page Web transmise en tant que paramètre querystring. Je l'ai réalisé sur Windows avec .NET et IE, Gecko et WebKit, mais maintenant j'ai besoin de faire la même chose pour Safari sur OS X.

Je pense que je l'ai converti, mais malheureusement je suis en train de courir un problème d'exécuter le script d'Apache sur 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) 

l'erreur est jeté sur la dernière ligne "initWithContentRect ...". L'erreur que je vois est:

<class 'objc.error'>: NSInternalInconsistencyException - Error (1002) creating CGSWindow 
    args = ('NSInternalInconsistencyException - Error (1002) creating CGSWindow',) 
    message = 'NSInternalInconsistencyException - Error (1002) creating CGSWindow' 
    name = u'NSInternalInconsistencyException' 

Si je lance le script sur la ligne de commande (après avoir enlevé la substance CGI), il fonctionne parfaitement.

Voici les bibliothèques que je importe:

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

Il pourrait être un problème de permissions: http://www.mail-archive.com/[email protected]/msg27379.html – kevingessner

Répondre

2

Vous ne pouvez pas (en général) se connecter au serveur de la fenêtre d'un processus non associé à un utilisateur de l'interface graphique. Voir ceci Apple tech note. Fondamentalement, c'est un grand no-no à utiliser NSWindow etc. du processus engendré par Apache. Le serveur de fenêtre n'est même pas garanti si aucun utilisateur de l'interface graphique n'est connecté. Vous ne pouvez donc pas faire ce que vous essayez de faire de manière fiable.

Le problème est que le WebKit fourni avec OS X dépend du serveur de fenêtres. Une solution pourrait consister à installer Qt, qui, nous l'espérons, possède un backend de WebKit indépendant du serveur de la fenêtre Core Graphics.

+0

Je vois. J'avais prévu de l'utiliser sur un XServe sans que quelqu'un ne se connecte, donc vous avez raison, ça ne semble pas être un bon ajustement. Je vais jeter un coup d'oeil à l'encapsuleur WebKit de Qt. Merci! –

Questions connexes