我使用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()
错过的终端环境中存在什么?
任何见解或指导都会启动我的项目!
答案 0 :(得分:2)
在终端中输入"*"
时,它只是告诉Linux不要将*
扩展为"当前文件夹的所有内容",并且在Windows上没有任何特别之处(双引号对于防止空格很有用。在这两种情况下,*
都会传递给java命令行。
但是当作为subprocess
传递给list
时(传递字符串时它是不同的,我不建议这样做),\"*\"
(否)需要反斜杠BTW)作为"*"
传递给java _literally,因此它与传递*
所以你必须将这个参数改为*
,如下所示:
call(['java', '-cp', '*','-Xmx2g', ...
答案 1 :(得分:1)
如评论中所述,"*"
直接作为argv
的一部分传递,不会被评估为glob。那是因为subprocess.call()
没有调用shell。相反,它直接调用exec()
系统调用。
您可以通过以下任何方式解决此问题:
"java"
之前的第一个参数。shell=True
。call()
参数
argv
。对于一般情况,你可以选择,但因为这是Java,#3可能是你最好的选择。 Java对于它如何处理类路径通配符有点奇怪,它因操作系统而异,根据我的经验,如果你在类路径中避免使用通配符,那么你会有更少的麻烦。见Setting multiple jars in java classpath