2016-08-23 10 views
0

J'essaie d'exécuter un programme python (sikuli) qui importe un fichier jar à l'aide de jnius. Tel est le sens du code dans le package Sikuli qui charge le fichier jar en pythonlaunchservicesd: échec secTaskLoadEntitlements = 22 lors du chargement de java

import os 
jarpath = "/Users/*/sikuli-api-1.0.3-standalone.jar" 
os.environ['CLASSPATH'] = jarpath 
from jnius import autoclass 
DesktopMouse = autoclass('org.sikuli.api.robot.desktop.DesktopMouse') 
aa = DesktopMouse() 
gg = aa.getLocation() 

Ce code fonctionne sans aucun problème quand je lance dans les fenêtres. Mais quand je lance ceci dans mac, le programme se bloque avec une icône Java dans le dock. java icon. et j'obtiens cette erreur/message dans les logs quand j'exécute le script python. Quelqu'un peut-il dire ce que cette erreur signifie (ou la raison de l'icône de hang/java dans le dock)?

launchservicesd: SecTaskLoadEntitlements failed error=22 
appleeventsd: SecTaskLoadEntitlements failed error=22 
Je voudrais déboguer la raison de ce blocage, mais toute aide dans le débogage de cette erreur serait la bienvenue.

Répondre

0

Il y a deux réponses à votre question sur l'icône du Dock, la première des raisons pour lesquelles il apparaît et la seconde raisons pour lesquelles il reste:

  1. À moins que la machine virtuelle Java est lancée avec -Djava.awt.headless=true, puis la machine virtuelle Java initialise le sous-système GUI (AWT ou Swing) lorsqu'un programme en cours accède pour la première fois à une classe ou à une méthode. On peut trivialement voir en action en utilisant le programme jjs dans le JRE:

    Cette commande exécute mais pas cause de l'icône du Dock:

    echo 'java.lang.System.out.println("hello")' | $JAVA_HOME/jre/bin/jjs

    Cette commande fonctionnera mais sera faire l'icône du dock:

    printf 'var f = new javax.swing.JFrame("frame 1")\nf.setVisible(true)\n' | \ $JAVA_HOME/jre/bin/jjs

    acte Vous faire sivement ont une influence sur l'icône qui apparaît dans le dock, via -Xdock:iconas described here, si vous voulez comme une plus belle icône pour apparaître

  2. L'exécution de cette deuxième extrait ci-dessus, celui avec JFrame en elle, met en lumière la deuxième partie de la raison pour laquelle une icône de Dock reste: en raison du thread AWT-EventQueue-0 qui est responsable de l'envoi des événements GUI à tous les gestionnaires d'événements enregistrés dans votre programme, la JVM ne quitte pas lorsque votre programme se termine, car seul le thread principal a quitté , et pas ceux de l'interface graphique.

    La machine virtuelle Java ne sait pas que vous fini d'interagir avec elle, et sera donc attendre indéfiniment jusqu'à ce que vous arrêtez le sous-système graphique ou d'arrêter la machine virtuelle Java

Pour résoudre votre problème « accrocher », fermant avec force vers le bas de la JVM via System.exit(0) peut fonctionner correctement pour vos besoins. Je suppose que la syntaxe jnius serait quelque chose comme:

jls = autoclass("java.lang.System") 
jls.exit(0) 

mais que la syntaxe est ma seule spéculation, que je n'ai pas jnius installé sur mon système.