使用Runtime.exec从Java运行python脚本(导入spacy)



我遇到了这个问题。我有一个Python脚本在做一些语义相似的事情。这个脚本包含导入spacy语句。这个脚本有一个方法和两个参数。当我在终端中运行这个脚本时,一切都很顺利。

import spacy
import sys
# Create your models here.
class Clustering():
nlp=None
def __init__(self):
self.nlp = spacy.load("es_core_news_md")

def process_text(self, text):
...
return " ".join(result)

def find_similarity(self, text1, text2):
fixedText1 = self.process_text(text1)
fixedText2 = self.process_text(text2)

doc1 = self.nlp(fixedText1)
doc2 = self.nlp(fixedText2)

print(doc1.similarity(doc2))

if __name__ == '__main__':
clus = Clustering('es', 'md')
clus.find_similarity(sys.argv[2],sys.argv[3])

这就是我运行脚本的方式

python semanticsimilarity.py find_similarity 'El perro se salió del pozo' 'El banano se salió del pozo'

然而,当我在Java:中运行它时

Process p = Runtime.getRuntime().exec("python semanticsimilarity.py find_similarity 'El perro se salió del pozo' 'El banano se salió del pozo'");
p.waitFor();

我得到这个错误:

Traceback (most recent call last):
File "semanticsimilarity.py", line 9, in <module>
import spacy
ImportError: No module named spacy

有什么办法绕过这个吗?我认为java试图在JVM中运行这个,或者其他什么,我不知道。

谢谢。

最有可能与ENV变量-PATH , LD_LIBRARY_PATH and PYTHONPATH有关。将它们设置为原始的java启动,或者在python命令上使用shell脚本包装器来显式设置

从脚本工作的终端echo PATH=$PATH ; echo PYTHONPATH =$PYTHONPATH ; echo LD_LIBRARY_PATH =$LD_LIBRARY_PATH ;获取ENV值


Option-1设置在您的档案中

export PATH=
export PYTHONPATH=
export LD_LIBRARY_PATH=

Option-2创建包装脚本
wrapSymSim.sh

export PATH=
export PYTHONPATH=
export LD_LIBRARY_PATH=
python semanticsimilarity.py "$@"

在您的java 中调用此

Process p = Runtime.getRuntime().exec("wrapSymSim.sh find_similarity 'El perro se salió del pozo' 'El banano se salió del pozo'");
p.waitFor();

Python脚本依赖于命令行shell设置的变量。@PrasadU建议的设置应该有效,或者您可以使用ProcessBuilder类为Python设置相同的因变量集。

由于您的普通命令行shell已经设置好了,另一种方法是简单地首先启动您的普通shell,然后让它启动您的Python脚本,因为这正是您在普通脚本启动中真正要做的。

因此,如果你使用Windows CMD.EXE或Linux BASH,其中一个可能会按原样工作:

Process p = Runtime.getRuntime().exec("/bin/bash -c "python semanticsimilarity.py find_similarity 'El perro se salió del pozo' 'El banano se salió del pozo'"");

Process p = Runtime.getRuntime().exec("CMD.EXE /c "python semanticsimilarity.py find_similarity 'El perro se salió del pozo' 'El banano se salió del pozo'"");

最新更新