Python用于运行Java JAR,ClassNotFoundException

时间:2017-04-10 19:29:31

标签: java python jar stanford-nlp classnotfoundexception

我使用Pythons' subprocess模块来运行命令。

该命令用于运行 java JAR文件

当我通过终端运行时,它运行正常,产生所需的输出。

JAVA 命令通过终端:

java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref,depparse -file input/input.txt

我编写了一个简单的Python脚本来运行相同的命令。

from subprocess import call
def main():
    call(['java', '-cp', '\"*\"','-Xmx2g','edu.stanford.nlp.pipeline.StanfordCoreNLP','-annotators','tokenize,pos,lemma,ner,parse,dcoref,depparse', '-file', 'input/input.txt'])

终端命令(来自我运行JAVA命令的同一文件夹):

python script.py

这里的输出是:

Error: Could not find or load main class     edu.stanford.nlp.pipeline.StanfordCoreNLP

当我从python运行它或从终端运行它时,我错过了什么不相同?
蟒蛇call()错过的终端环境中存在什么?

任何见解或指导都会启动我的项目!

2 个答案:

答案 0 :(得分:2)

在终端中输入"*"时,它只是告诉Linux不要将*扩展为"当前文件夹的所有内容",并且在Windows上没有任何特别之处(双引号对于防止空格很有用。在这两种情况下,*都会传递给java命令行。

但是当作为subprocess传递给list时(传递字符串时它是不同的,我不建议这样做),\"*\"(否)需要反斜杠BTW)作为"*"传递给java _literally,因此它与传递*

不同

所以你必须将这个参数改为*,如下所示:

call(['java', '-cp', '*','-Xmx2g', ...

答案 1 :(得分:1)

如评论中所述,"*"直接作为argv的一部分传递,不会被评估为glob。那是因为subprocess.call()没有调用shell。相反,它直接调用exec()系统调用。

您可以通过以下任何方式解决此问题:

  1. 指定shell。它应该是"java"之前的第一个参数。
  2. shell=True
  3. 中加入call()参数
  4. argv
  5. 中明确添加类路径条目

    对于一般情况,你可以选择,但因为这是Java,#3可能是你最好的选择。 Java对于它如何处理类路径通配符有点奇怪,它因操作系统而异,根据我的经验,如果你在类路径中避免使用通配符,那么你会有更少的麻烦。见Setting multiple jars in java classpath