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()
系统调用。
您可以通过以下任一方法解决此问题:
- 指定 shell。它应该是第一个参数,在
"java"
. 之前
- 在
call()
中包含 shell=True
参数。
- 在
argv
中明确添加您的类路径条目。
对于一般情况,您可以自行选择,但因为这是 Java,#3 可能是您的最佳选择。 Java 关于它处理类路径通配符的方式有点奇怪,并且它因操作系统而异,根据我的经验,如果避免在类路径中使用通配符,就会减少麻烦。参见 Setting multiple jars in java classpath
我正在使用 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()
系统调用。
您可以通过以下任一方法解决此问题:
- 指定 shell。它应该是第一个参数,在
"java"
. 之前
- 在
call()
中包含shell=True
参数。 - 在
argv
中明确添加您的类路径条目。
对于一般情况,您可以自行选择,但因为这是 Java,#3 可能是您的最佳选择。 Java 关于它处理类路径通配符的方式有点奇怪,并且它因操作系统而异,根据我的经验,如果避免在类路径中使用通配符,就会减少麻烦。参见 Setting multiple jars in java classpath