我正在尝试运行一个使用jnius导入jar的python程序(sikuli)。这是sikuli包中的代码的要点,它在python中加载jar文件
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图标的原因)?我想调试这个挂起的原因,但是欢迎任何调试此错误的帮助。
答案 0 :(得分:0)
关于停靠栏图标的问题有两个答案,第一个是关于它出现的原因,第二个是关于停留原因的问题:
除非使用-Djava.awt.headless=true
启动JVM,否则当正在运行的程序首次访问其中的类或方法时,JVM将初始化GUI子系统(AWT或Swing)。可以使用JRE中的jjs
程序轻松地看到这一点:
此命令将运行但不会导致停靠栏图标:
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
as described here对停靠栏中显示的图标产生影响。
运行上面的第二个片段,其中包含JFrame
的片段,揭示了停靠码图标的原因的第二部分:由于AWT-EventQueue-0
线程负责调度GUI事件发送到程序中所有已注册的事件处理程序,当程序完成时,JVM不会退出,因为只有主线程退出,而不是GUI线程。
JVM不知道您已完成与它的交互,因此将永远等待,直到您关闭GUI子系统或停止JVM
解决你的问题"挂起"问题,通过System.exit(0)
强行关闭JVM可能会很好地满足您的需求。我认为jnius
语法类似于:
jls = autoclass("java.lang.System")
jls.exit(0)
但是这种语法只是我的推测,因为我没有在我的系统上安装jnius
。