Python用于运行Java JAR,ClassNotFoundException
我正在使用Pythons的Python用于运行Java JAR,ClassNotFoundException,java,python,jar,stanford-nlp,classnotfoundexception,Java,Python,Jar,Stanford Nlp,Classnotfoundexception,我正在使用Pythons的子流程模块来运行命令 该命令用于运行java JAR文件 当我通过终端运行它时,它运行良好,产生了所需的输出 通过终端的JAVA命令: java-cp“*”-Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP-注释器标记化、ssplit、pos、引理、ner、parse、dcoref、depparse-文件输入/input.txt 我已经编写了一个简单的Python脚本来运行相同的命令 from subprocess impo
子流程
模块来运行命令
该命令用于运行java JAR文件
当我通过终端运行它时,它运行良好,产生了所需的输出
通过终端的JAVA命令:
java-cp“*”-Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP-注释器标记化、ssplit、pos、引理、ner、parse、dcoref、depparse-文件输入/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'])
Terminal命令(与我运行JAVA命令的文件夹相同):
这里的输出是:
Error: Could not find or load main class edu.stanford.nlp.pipeline.StanfordCoreNLP
当我从python运行它或从终端运行它时,我不知道什么是不一样的?在终端环境中,pythons
call()
遗漏了什么
任何洞察力或方向都会启动我的项目 在终端中键入“*”
时,它只是告诉Linux不要将*
扩展到“当前文件夹的所有内容”,并且在Windows上不做任何特殊操作(双引号有助于防止空格)。在这两种情况下,*
被传递到java命令行
但是当以列表的形式传递到子流程时(传递字符串时是不同的,我不建议这样做),\“*\”
(不需要反斜杠BTW)会以“*”
的形式传递到java,所以它与传递*
不同
因此,您只需将该参数更改为*
,如下所示:
call(['java', '-cp', '*','-Xmx2g', ...
如注释中所述,“*”
作为argv
的一部分直接传递,不作为glob进行评估。这是因为subprocess.call()
不调用shell。相反,它直接调用exec()
系统调用
您可以通过以下任一方法解决此问题:
指定shell。它应该是“java”
之前的第一个参数
在call()
中包含shell=True
参数
在argv
中显式添加类路径条目
对于一般情况,您可以选择,但因为这是Java,所以#3可能是您的最佳选择。Java在处理类路径通配符方面有点奇怪,它因操作系统而异,根据我的经验,如果避免在类路径中使用通配符,那么麻烦就会少一些。请参见我该如何处理这个问题?我应该输入实际的字符编码值还是ASCII值@用户2357112
call(['java', '-cp', '*','-Xmx2g', ...