Python 用于 运行 Java JAR,ClassNotFoundException

Python used to run Java JAR, ClassNotFoundException

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

命令用于运行javaJAR文件.

当我通过 终端 运行 时,它 运行 可以很好地产生所需的输出。

通过终端的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 或 运行 从终端 运行 时,我不知道有什么不同?
pythons call() 遗漏的终端环境中存在什么?

任何见解或方向都会启动我的项目!

当您在终端中输入 "*" 时,它只是告诉 Linux 不要将 * 扩展为 "all the contents of the current folder",并且不会对 Windows 做任何特别的事情(双引号有助于防止出现空格)。在这两种情况下,* 都会传递到 java 命令行。

但是当作为 list 传递给 subprocess 时(传递字符串时不同,我不建议这样做),\"*\"(顺便说一句,不需要反斜杠) 传递给 java _literally 作为 "*" 所以它与传递 *

不同

所以你必须像这样将参数更改为 *

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

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

您可以通过以下任一方法解决此问题:

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

对于一般情况,您可以自行选择,但因为这是 Java,#3 可能是您的最佳选择。 Java 关于它处理类路径通配符的方式有点奇怪,并且它因操作系统而异,根据我的经验,如果避免在类路径中使用通配符,就会减少麻烦。参见 Setting multiple jars in java classpath