首先,我已经在我自己的 jarfile 上测试了你的代码。确实,我遇到了这样的错误:
TypeError: Package clip.frontend.Start.main is not Callable
然后,在仔细阅读文档后,我使用了另一种方法。
import jpype
# I've used other set of parameters to JVM, and modified a bit your classpath setting.
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=clip.jar")
# Second difference, I decided to use JClass because it was more clear for me.
# Parameter array was kept empty.
jpype.JClass("clip.frontend.Start").main([])
jpype.shutdownJVM()
输出是正确的:
% python2 main.py
2 2
+>+[<[>>+>+<<<-]>>[<<+>>-]>[[-]>>>>>>+<<<<<<<<<[-]>[-]>>>>>>>>[<<<<<<<<+>+>>>>>>>-]
<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[-]<<<<<<]<<<[>>+>+<<<-]>>[<<+>>-]>[[-]>>>>>>++
[<<<<<+>>>>>>>>>>>>+<<<<<<<-]<<<<<[>>>>>+<<<<<-]>>>>>>>>>>>>>[>>]+<<[<<]>[>[>>]
<+<[<<]>-]<<<<<<<[-]++[<<<<<+>>>>>>>>>>>>+<<<<<<<-]<<<<<[>>>>>+<<<<<-]>>>>>>>>>>>>>
[>>]+<<[<<]>[>[>>]<+<[<<]>-]<<<<<<<[-]#JVM has been shutdown
现在,我决定翻译我的解决方案以匹配您的问题:
import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=astral.jar")
jpype.JClass("phylonet.coalescent.CommandLine").main([])
jpype.shutdownJVM()
并且代码可以正常工作。比实际解决方案更重要的是,为什么您的代码不起作用。您使用了错误的参数集并以另一种方式指定了类路径。
用JPackage替换JClass,代码仍然有效。
import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=astral.jar")
jpype.JPackage('phylonet').coalescent.CommandLine.main([])
jpype.shutdownJVM()
由于从类路径中提取类的方式是正确的,唯一可能的原因是指定了无效的参数集。删除-ea
代码后仍然有效,所以你犯的错误在于这段代码。
'-Djava.class.path="%s"' % jar
事实上,我已经用它来反对我的答案,并且bam,代码产生了这个:
TypeError: Package phylonet.coalescent.CommandLine.main is not Callable
这意味着,参数包含以下内容:
-Djava.class.path="astral.jar"
而不是跟随
-Djava.class.path=astral.jar
引号放错了位置并引发了结果错误。