首页 > 解决方案 > 使用 Runtime.exec 从 Java 运行 python 脚本(导入 spacy)

问题描述

我有这个问题。我有一个 Python 脚本做一些语义相似性。该脚本包括 import 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 或其他东西中运行它,我不知道。

谢谢你。

标签: javapythonshellspacy

解决方案


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

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


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();

推荐阅读