0

我正在尝试运行一个使用jnius导入 jar 的 python 程序 (sikuli) 。这是在 python 中加载 jar 文件的 sikuli 包中代码的要点

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()

当我在 Windows 中运行时,此代码运行没有任何问题。但是当我在 mac 中运行它时,程序会在 Dock 中挂起一个 java 图标。图标. 当我运行 python 脚本时,我在日志中收到此错误/消息。

launchservicesd: SecTaskLoadEntitlements failed error=22
appleeventsd: SecTaskLoadEntitlements failed error=22

谁能说出这个错误的含义(或扩展坞中挂起/java图标的原因)?我想调试此挂起的原因,但欢迎在调试此错误方面提供任何帮助。

4

1 回答 1

0

关于停靠图标的问题有两个答案,第一个是关于它出现的原因,第二个是关于它为什么仍然存在的问题:

  1. 除非 JVM 使用 启动-Djava.awt.headless=true,否则 JVM 将在运行程序第一次访问其中的类或方法时初始化 GUI 子系统(AWT 或 Swing)。jjs使用JRE 中的程序可以很容易地看到这一点:

    此命令将运行但不会导致停靠图标:

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

    此命令将运行,但导致停靠图标:

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

    如果您只想显示一个更好的图标,您实际上确实可以通过-Xdock:icon 此处描述的方式对 Dock 中出现的图标产生影响

  2. 运行上面的第二个片段,其中包含JFrame的那个,揭示了为什么停靠图标仍然存在的第二部分:由于AWT-EventQueue-0负责将 GUI 事件分派到程序中所有已注册事件处理程序的线程,JVM 不会当你的程序完成时退出,因为只有主线程已经退出,而不是 GUI 线程。

    JVM 不知道您已完成与它的交互,因此将永远等待,直到您关闭 GUI 子系统或停止 JVM

为了解决您的“挂起”问题,通过强制关闭 JVMSystem.exit(0)可能满足您的需求。我认为jnius语法将类似于:

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

但该语法只是我的猜测,因为我没有jnius安装在我的系统上。

于 2017-03-19T21:32:07.943 回答