jpype simple jar导入并运行main()

2024-10-02 18:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图打开一个jar文件并执行它的主函数,但是jpype抛出了一个对我来说没有意义的错误。这是我的代码:

jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path="%s"' % jar)
CommandLine = jpype.JPackage('phylonet').coalescent.CommandLine
CommandLine.main(['-i', input_file, '-o', output_file])
jpype.shutdownJVM()

我得到这个错误: 类型错误:包phylonet.coalinent.CommandLine.main不可调用

我提供了jar文件的绝对路径,并从META-INF中获得了main函数/清单.MF公司名称:

^{pr2}$

我试图打开的jar文件名为astral,从这里开始:https://github.com/smirarab/ASTRAL

像这样称呼它就像预期的那样工作:

java -Djava.class.path="./astral.jar"

所以当我用jpype调用它时为什么不呢?在


Tags: 文件path函数代码main错误jpypeclass
2条回答

这是JPype的经典问题。如果无法加载jar,那么JPackage将返回另一个不可调用的JPackage。导致装载失败的常见原因包括

  • 加载的JVM不支持jar的版本(检查getDefaultJVMPath()不是某个旧版本)
  • 缺少jar依赖项。在
  • JVM找不到指定路径的Jar。在

{1>在加载之前的解决方案}上打印。0.7.0版本(目前作为候选版本提供)已经解决了这个问题。在

另外,建议您在导入类时使用jpype.imports或{},而不是{}。它更安全,因为它会报告一个更有意义的错误。例如:

import jpype
import jpype.imports

jpype.startJVM()
jpype.imports.registerDomain('phylonet')  # This is required as phylonet is not a tld

from phylonet.coalescent import CommandLine

您可以将一个包标记为一致(类从上面开始,包从下面开始)以强制错误。在

首先,我在自己的jarfile上测试了您的代码。事实上,我被提出了这样的错误:

TypeError: Package clip.frontend.Start.main is not Callable

然后,在仔细阅读了文档之后,我使用了另一种方法。在

^{pr2}$

输出是正确的:

% 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

事实上,我用这个来反对我的答案,砰,代码产生了这样的结果:

TypeError: Package phylonet.coalescent.CommandLine.main is not Callable

这意味着,包含以下参数:

-Djava.class.path="astral.jar"

而不是跟随

-Djava.class.path=astral.jar

引号放错地方了,结果引起了错误。在

相关问题 更多 >