在Java中调用Python

        </h1><div class="clear"></div><div class="postBody">

写在前面

在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。

直接通过Runtime进行调用

我们知道,在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法。

public class InvokeByRuntime{/*** @param args* @throws IOException * @throws InterruptedException */public static void main(String[] args) throws IOException, InterruptedException{String exe = "python";String command = "D:\\calculator_simple.py";String num1 = "1";String num2 = "2";String[] cmdArr = new String[] {exe, command, num1, num2};Process process = Runtime.getRuntime().exec(cmdArr);InputStream is = process.getInputStream();DataInputStream dis = new DataInputStream(is);String str = dis.readLine();process.waitFor();System.out.println(str);}
}

输出:

3

calculator_simple.py:

# coding=utf-8
from sys import argv

num1 = argv[1]
num2 = argv[2]
sum = int(num1) + int(num2)
print sum

显然,在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,然后在Java中通过标准输入流读取Python的输出值。

通过Jython调用

通过Jython调用Python?我在听到这个概念的时候一脸懵逼,不是说好的在Java中调用Python程序吗?这个Jython是什么鬼?难道是一个在Java中调用Python程序的组件或工具?其实,关于Jython是什么这个疑问,我估计有许多人在一开始接触的时候也是很疑惑的,下面我们就一一道来。

1. 什么是Jython

Jython主页:http://www.jython.org/currentdocs.html
按照官方的定义,Jython是Python语言在Java平台的实现。这个概念似乎有点拗口,反正我一开始并没有理解。Python难道不已经是一门语言了吗?什么叫做Jython是Python语言在Java平台的实现?
实际上,之所以存在这样的困惑主要是因为我们对Python语言的相关概念掌握和理解不清楚导致的。
Python其实只是一个语言规范,它存在多个不同语言实现的版本。具体来说,目前Python语言存在如下几个具体实现:
(1)CPython:CPython是标准Python,也是其他Python编译器的参考实现。通常提到“Python”一词,都是指CPython。CPython由C编写,将Python源码编译成CPython字节码,由虚拟机解释执行。没有用到JIT等技术,垃圾回收方面采用的是引用计数。
(2)Jython:Jython是在JVM上实现的Python,由Java编写。Jython将Python源码编译成JVM字节码,由JVM执行对应的字节码。因此能很好的与JVM集成,比如利用JVM的垃圾回收和JIT,直接导入并调用JVM上其他语言编写的库和函数。
(3)IronPython:IronPython与Jython类似,所不同的是IronPython在CLR上实现的Python,即面向.NET平台,由C#编写。IronPython将源码编译成TODO CLR,同样能很好的与.NET平台集成。即与Jython相同,可以利用.NET框架的JIT、垃圾回收等功能,能导入并调用.NET上其他语言编写的库和函数。IronPython默认使用Unicode字符串。
(4)PyPy:这里说的PyPy是指使用RPython实现,利用Tracing JIT技术实现的Python,而不是RPython工具链。PyPy可以选择多种垃圾回收方式,如标记清除、标记压缩、分代等。
(5)Pyston:Pyston由Dropbox开发,使用C++11编写,采用Method-at-a-time-JIT和Mark Sweep——Stop the World的GC技术。Pyston使用类似JavaScript V8那样的多层编译,其中也用到了LLVM来优化代码。

所以,我们现在再来理解什么是Jython就非常清楚了:Jython是Python语言规范在Java平台的具体实现。具体来说,可以将Python源码编译为JVM可以解释执行的字节码。
Jython原本叫做JPython,于1997年由Jim Hugunin创建,后来在1999年2.0版本发布的时候由Barry Warsaw更名为Jython,在这里我们就不再深究为什么要把JPython更名为Jython的原因了。注意: Jython从2.0版本开始就与CPython的版本保持一致,即:Jython 2.7与CPython 2.7保持对应。

虽然我们理解了什么是Jython,但是还存在一个疑问,为什么Python语言存在这么多不同语言的实现呢?为什么不能就只存在一个C语言实现的版本就可以了呢?存在这么多版本,真的给初学者带来了许多困惑。
当然,要回答这个问题可能就需要深究一些历史的原因了,就此打住。我们在此只讨论使用Jython能做什么以及如何使用Jython?

2. 使用Jython能做什么

既然Jython是Python语言在Java平台的实现,是Java语言实现的,那么是否可以在Jython程序中调用Java,在Java中也能调用Jython呢?
答案是肯定的,实际上,Jython的主要通途就是在Java中调用Python程序;而且,还可以直接在Jython程序中引用Java。

3. 如何使用Jython

3.1 安装Jython

在Jython的官方下载页面我们可以看到如下描述(详见:http://www.jython.org/downloads.html)

显然,可以下载2个Jython的jar包。其中,jython-installer-${version}.jar是用于安装Jython的,jython-standalone-${version}.jar用于嵌入到Java程序中使用。
什么意思?我一开始也是很疑惑,为什么要提供2个不同的jar包呢?他们有什么不同呢?2个不同的Jar包如何使用呢?
首先,jython-installer-${version}.jar用于安装Jython,就好比我们需要安装JRE,用于运行Java程序。除此之外,当需要在Python程序中引用一些公共的第三方库时,也需要先安装Jython才能下载所依赖的模块。

下载jython-installer-${version}.jar完毕之后,进入控制台,执行如下命令:

java -jar jython-installer-${version}.jar

此时会弹出一个图形化的安装界面,只需要一步一步选择相应参数进行安装即可。安装完毕之后,请将Jython安装目录添加为环境变量JYTHON_HOME,同时添加bin目录到PATH变量中:PATH=$PATH:$JYTHON_HOME/bin
进入控制台,执行如下命令就可以进入Jython的交互环境,这与CPython(我们通常说的Python)的命令行交互环境是一样的。

> jython
Jython 2.7.0 (default:9987c746f838, Apr 29 201502:25:11)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_121
Type "help""copyright""credits" or "license" for more information.
>>>print("hello,world")
hello,world
>>>

当然,我们还可以使用jython命令运行一个Python程序。

> jython helloworld.py
hello,world

helloworld.py:

import sys

print(“hello,world”)

上面我们看到在Jython官网提供了2个Jar包,一个用于安装Jython,执行Python程序。那么,jython-standalone-${version}.jar又有什么用途呢?
实际上,当我们需要在Java中调用Python程序时,除了直接使用Java的Runtime调用,还可以直接使用Jython的API进行调用,而且通过Jython API可以直接调用Python程序中的指定函数或者对象方法,粒度更加精细。
当我们需要调用Jython的API时有两种方式:
第一,如果项目使用Maven进行构建,可以直接添加Jython的依赖配置到pom.xml文件中,如:

<dependency><groupId>org.python</groupId><artifactId>jython</artifactId><version>2.7.0</version>
</dependency>

第二,可以直接将jython-standalone-${version}.jar添加到项目classpath中,这样也可以调用Jython的相关API了。也就是说,jython-standalone-${version}.jar就是一个提供Jython API的jar独立jar包。

3.2 Java调用Python程序实践

Java通过Jython API调用Python程序,有几种用法:
(1)在Java中执行Python语句,相当于在Java中嵌入了Python程序,这种用法不常见,也没有太大的实际意义。

public static void main(String[] args){System.setProperty("python.home""D:\\jython2.7.0");PythonInterpreter interp = new PythonInterpreter();// 执行Python程序语句interp.exec("import sys");interp.set("a"new PyInteger(42));interp.exec("print a");interp.exec("x = 2+2");PyObject x = interp.get("x");System.out.println("x: " + x);
}

输出:

42
x: 4

(2)在Java中简单调用Python程序,不需要传递参数,也不需要获取返回值。

public static void main(String[] args) throws IOException{System.setProperty("python.home""D:\\jython2.7.0");String python = "D:\\simple_python.py";PythonInterpreter interp = new PythonInterpreter();interp.execfile(python);interp.cleanup();interp.close();
}

simple_python.py:

# coding=utf-8
print("Do simple thing in Python")
print("输出中文")

(3)在Java中单向调用Python程序中的方法,需要传递参数,并接收返回值。Python既支持面向函数式编程,也支持面向对象编程。因此,调用Python程序中的方法也分别以面向函数式编程和面向对象式编程进行说明。

public static void main(String[] args) throws IOException{System.setProperty("python.home""D:\\jython2.7.0");
<span class="hljs-comment">// 1. Python面向函数式编程: 在Java中调用Python函数</span>
String pythonFunc = <span class="hljs-string">"D:\\calculator_func.py"</span>;PythonInterpreter pi1 = <span class="hljs-keyword">new</span> PythonInterpreter();
<span class="hljs-comment">// 加载python程序</span>
pi1.execfile(pythonFunc);
<span class="hljs-comment">// 调用Python程序中的函数</span>
PyFunction pyf = pi1.get(<span class="hljs-string">"power"</span>, PyFunction.class);
PyObject dddRes = pyf.__call__(Py.newInteger(<span class="hljs-number">2</span>), Py.newInteger(<span class="hljs-number">3</span>));
System.out.println(dddRes);
pi1.cleanup();
pi1.close();<span class="hljs-comment">// 2. 面向对象式编程: 在Java中调用Python对象实例的方法</span>
String pythonClass = <span class="hljs-string">"D:\\calculator_clazz.py"</span>;
<span class="hljs-comment">// python对象名</span>
String pythonObjName = <span class="hljs-string">"cal"</span>;
<span class="hljs-comment">// python类名</span>
String pythonClazzName = <span class="hljs-string">"Calculator"</span>;
PythonInterpreter pi2 = <span class="hljs-keyword">new</span> PythonInterpreter();
<span class="hljs-comment">// 加载python程序</span>
pi2.execfile(pythonClass);
<span class="hljs-comment">// 实例化python对象</span>
pi2.exec(pythonObjName + <span class="hljs-string">"="</span> + pythonClazzName + <span class="hljs-string">"()"</span>);
<span class="hljs-comment">// 获取实例化的python对象</span>
PyObject pyObj = pi2.get(pythonObjName);
<span class="hljs-comment">// 调用python对象方法,传递参数并接收返回值</span>
PyObject result = pyObj.invoke(<span class="hljs-string">"power"</span>, <span class="hljs-keyword">new</span> PyObject[] {Py.newInteger(<span class="hljs-number">2</span>), Py.newInteger(<span class="hljs-number">3</span>)});
<span class="hljs-keyword">double</span> power = Py.py2double(result);
System.out.println(power);pi2.cleanup();
pi2.close();

}

输出:

8.0
8.0

calculator_func.py:

# coding=utf-8
import math

# 面向函数式编程
def power(x, y):
return math.pow(x, y)

calculator_clazz.py:

# coding=utf-8
import math

# 面向对象编程
class Calculator(object):

<span class="hljs-comment"># 计算x的y次方</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">power</span><span class="hljs-params">(self, x, y)</span>:</span><span class="hljs-keyword">return</span> math.pow(x,y)</code></pre>

(4)高级调用,也是在Java中调用Python程序最常见的用法:Python程序可以实现Java接口,在Python中也可以调用Java方法。

public static void main(String[] args) throws IOException{System.setProperty("python.home""D:\\jython2.7.0");
<span class="hljs-comment">// Python程序路径</span>
String python = <span class="hljs-string">"D:\\python\\fruit_controller.py"</span>;
<span class="hljs-comment">// Python实例对象名</span>
String pyObjName = <span class="hljs-string">"pyController"</span>;
<span class="hljs-comment">// Python类名</span>
String pyClazzName = <span class="hljs-string">"FruitController"</span>;Fruit apple = <span class="hljs-keyword">new</span> Apple();
Fruit orange = <span class="hljs-keyword">new</span> Orange();PythonInterpreter interpreter = <span class="hljs-keyword">new</span> PythonInterpreter();
<span class="hljs-comment">// 如果在Python程序中引用了第三方库,需要将这些被引用的第三方库所在路径添加到系统环境变量中</span>
<span class="hljs-comment">// 否则,在执行Python程序时将会报错: ImportError: No module named xxx</span>
PySystemState sys = interpreter.getSystemState();
sys.path.add(<span class="hljs-string">"D:\\python"</span>);<span class="hljs-comment">// 加载Python程序</span>
interpreter.execfile(python);
<span class="hljs-comment">// 实例 Python对象</span>
interpreter.exec(pyObjName + <span class="hljs-string">"="</span> + pyClazzName + <span class="hljs-string">"()"</span>);<span class="hljs-comment">// 1.在Java中获取Python对象,并将Python对象转换为Java对象</span>
<span class="hljs-comment">// 为什么能够转换? 因为Python类实现了Java接口,通过转换后的Java对象只能调用接口中定义的方法</span>
GroovyController controller = (GroovyController) interpreter.get(pyObjName).__tojava__(GroovyController.class);
controller.controllFruit(apple);
controller.controllFruit(orange);<span class="hljs-comment">// 2.在Java直接通过Python对象调用其方法</span>
<span class="hljs-comment">// 既可以调用实现的Java接口方法,也可以调用Python类自定义的方法</span>
PyObject pyObject = interpreter.get(pyObjName);
pyObject.invoke(<span class="hljs-string">"controllFruit"</span>, Py.java2py(apple));
pyObject.invoke(<span class="hljs-string">"controllFruit"</span>, Py.java2py(orange));
pyObject.invoke(<span class="hljs-string">"printFruit"</span>, Py.java2py(apple));
pyObject.invoke(<span class="hljs-string">"printFruit"</span>, Py.java2py(orange));<span class="hljs-comment">// 3.在Java中获取Python类进行实例化对象: 没有事先创建 Python对象</span>
PyObject pyClass = interpreter.get(<span class="hljs-string">"FruitController"</span>);
PyObject pyObj = pyClass.__call__();
pyObj.invoke(<span class="hljs-string">"controllFruit"</span>, Py.java2py(apple));
pyObj.invoke(<span class="hljs-string">"controllFruit"</span>, Py.java2py(orange));PyObject power = pyObj.invoke(<span class="hljs-string">"power"</span>, <span class="hljs-keyword">new</span> PyObject[] {Py.newInteger(<span class="hljs-number">2</span>), Py.newInteger(<span class="hljs-number">3</span>)});
<span class="hljs-keyword">if</span>(power != <span class="hljs-keyword">null</span>) {<span class="hljs-keyword">double</span> p = Py.py2double(power);System.out.println(p);
}interpreter.cleanup();
interpreter.close();

}

输出:

Show: I am a java apple.
controllFruit Python Apple
controllFruit END
Show: I am a java orange.
controllFruit Python Orange
controllFruit END
Show: I am a java apple.
controllFruit Python Apple
controllFruit END
Show: I am a java orange.
controllFruit Python Orange
controllFruit END
Show: I am a java apple.
printFruit Python Apple
printFruit END
Show: I am a java orange.
printFruit Python Orange
printFruit END
Show: I am a java apple.
controllFruit Python Apple
controllFruit END
Show: I am a java orange.
controllFruit Python Orange
controllFruit END
8.0

fruit_controller.py:

# coding=utf-8

from calculator_clazz import Calculator
from java.lang import String
from org.test.inter import GroovyController
from org.test.inter import Fruit

# 在Python中实现Java接口: org.test.inter.GroovyController
class FruitController(GroovyController):

<span class="hljs-comment"># 实现接口方法</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">controllFruit</span><span class="hljs-params">(self, fruit)</span>:</span><span class="hljs-comment"># 在Python中调用Java对象方法</span>fruit.show()<span class="hljs-keyword">if</span>(fruit.getType() == <span class="hljs-string">"apple"</span>):<span class="hljs-keyword">print</span> (<span class="hljs-string">"controllFruit Python Apple"</span>)<span class="hljs-keyword">if</span>(fruit.getType() == <span class="hljs-string">"orange"</span>):<span class="hljs-keyword">print</span> (<span class="hljs-string">"controllFruit Python Orange"</span>)<span class="hljs-keyword">print</span> (<span class="hljs-string">"controllFruit END"</span>)<span class="hljs-comment"># 自定义新方法    </span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">printFruit</span><span class="hljs-params">(self, fruit)</span>:</span>fruit.show()<span class="hljs-keyword">if</span>(fruit.getType() == <span class="hljs-string">"apple"</span>):<span class="hljs-keyword">print</span> (<span class="hljs-string">"printFruit Python Apple"</span>)<span class="hljs-keyword">if</span>(fruit.getType() == <span class="hljs-string">"orange"</span>):<span class="hljs-keyword">print</span> (<span class="hljs-string">"printFruit Python Orange"</span>)<span class="hljs-keyword">print</span> (<span class="hljs-string">"printFruit END"</span>)<span class="hljs-comment"># 引用第三方python程序</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">power</span><span class="hljs-params">(self, x, y)</span>:</span>cal = Calculator()<span class="hljs-keyword">return</span> cal.power(x, y)</code></pre>

Java接口和实现类:

// 该接口用于在Python中实现
public interface GroovyController{public void controllFruit(Fruit fruit);
}

// 在Java中使用的接口
public interface Fruit {
public String getName();
public String getType();
public void show();
}

// Apple
public class Apple implements Fruit {
public String getName() {
return “java apple”;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getType</span><span class="hljs-params">()</span> </span>{<span class="hljs-keyword">return</span> <span class="hljs-string">"apple"</span>;
}<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">show</span><span class="hljs-params">()</span> </span>{System.out.println(<span class="hljs-string">"Show: I am a java apple."</span>);
}

}

// Orange
public class Orange implements Fruit {
public String getName() {
return “ava orange”;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getType</span><span class="hljs-params">()</span> </span>{<span class="hljs-keyword">return</span> <span class="hljs-string">"orange"</span>;
}<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">show</span><span class="hljs-params">()</span> </span>{System.out.println(<span class="hljs-string">"Show: I am a java orange."</span>);
}

}

另外,对于在eclipse中运行时控制台报错:

Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0

请添加VM参数:-Dpython.console.encoding=UTF-8,详见:http://blog.csdn.net/xfei365/article/details/50955731

总结

虽然在Java中调用Python可以有多种方式解决,甚至因为Jython的出现更显得非常便利。但是这种程序间嵌套调用的方式不可取,首先抛开调用性能不说,增加了耦合复杂度。更加有效的方式应该是通过RCP或者RESTful接口进行解耦,这样各司其职,也便于扩展,良好的架构是一个项目能够健康发展的基础。在微服务架构大行其道的今天,这种程序间嵌套调用的方式将会逐渐被淘汰。

【参考】
http://tonl.iteye.com/blog/1918245 Java调用Python
http://blog.csdn.net/supermig/article/details/24005585 Learning Python -- Java 通过JyThon调用Python实现的规则
http://blog.csdn.net/hpp1314520/article/details/72854011 java 利用Runtime.getRuntime().exec()调用python脚本并传参
http://blog.csdn.net/xingjiarong/article/details/49424253 java调用python方法总结
https://zh.wikipedia.org/wiki/Jython Jython
http://lib.csdn.net/article/python/1654 Jython的安装及简单例子
https://coolshell.cn/articles/2631.html 五大基于JVM的脚本语言
http://python.jobbole.com/82703/ 各种 Python 实现的简单介绍与比较
https://www.oschina.net/translate/why-are-there-so-many-pythons 为什么有这么多 Python?

作者:2Simple
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。

分类: Java核心基础, Web技术
<div id="blog_post_info">
好文要顶 关注我 收藏该文

2Simple
关注 - 2
粉丝 - 69

+加关注
4
0
<div class="clear"></div>
<div id="post_next_prev"><a href="https://www.cnblogs.com/nuccch/p/8433442.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/nuccch/p/8433442.html" title="发布于 2018-02-08 22:18">UUID在Java中的实现与应用</a>
<br>
<a href="https://www.cnblogs.com/nuccch/p/8436485.html" class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/nuccch/p/8436485.html" title="发布于 2018-02-09 18:05">优秀博客推荐</a>
posted @ 2018-02-09 15:33 2Simple 阅读(60370) 评论(28) 编辑 收藏
    <div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#1楼

            <!-- PostDate -->

2018-07-06 10:48

            <!--NameLink--><a id="a_comment_author_4014016" href="https://home.cnblogs.com/u/1388842/" target="_blank">我需要学习</a><div class="feedbackCon">
大佬这是已经调了第三方依赖吗
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#2楼

[楼主]

            <!-- PostDate -->

2018-07-07 21:27

            <!--NameLink--><a id="a_comment_author_4015211" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 我需要学习
博客中的示例没有调用第三方依赖包,在实际项目中已经遇到需要通过Jython调用第三方依赖包的情况了。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#3楼

            <!-- PostDate -->

2018-07-09 09:20

            <!--NameLink--><a id="a_comment_author_4015784" href="https://home.cnblogs.com/u/1388842/" target="_blank">我需要学习</a><div class="feedbackCon">
怎么调用第三方的的依赖包啊 求教 感谢
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#4楼

[楼主]

            <!-- PostDate -->

2018-07-10 10:14

            <!--NameLink--><a id="a_comment_author_4016778" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 我需要学习
是依赖的python库吗还是java库?
如果需要依赖第三方的python库,那么还是需要安装python自己的依赖管理进行处理,直接将第三方python库安装到$PYTHON_HOME/Lib/site-packages就可以了,简单点说,你可以直接使用pip进行安装第三方库就行。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#5楼

            <!-- PostDate -->

2018-07-10 14:43

            <!--NameLink--><a id="a_comment_author_4017045" href="https://www.cnblogs.com/zpf336/" target="_blank">丰峰锋</a><div class="feedbackCon">
@ 老C的技术文摘
你用的是$PYTHON_HOME/Lib/site-packages,这个是指Python的路径还是只Jython的路径?然后如果是Python的路径,可以顺利安装,可是如果是jython的easy_install 去安装到jython的路径,安装就会报各种依赖找不到。
如何使用呢?如果成功安装,如何使用呢,经测试,把这个路径加入到path中,还是报依赖找不到,路径不正确等:例如:

Exception in thread "main" Traceback (most recent call last):File "<string>", line 1, in <module>File "C:\jython2.7\Lib\site-packages\numpy\__init__.py", line 142, in <module>from . import add_newdocsFile "C:\jython2.7\Lib\site-packages\numpy\add_newdocs.py", line 13, in <module>from numpy.lib import add_newdocFile "C:\jython2.7\Lib\site-packages\numpy\lib\__init__.py", line 8, in <module>from .type_check import *
ImportError: No module named type_check

支持(0) 反对(0)

https://pic.cnblogs.com/face/749431/20150703143415.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#6楼

[楼主]

            <!-- PostDate -->

2018-07-12 22:29

            <!--NameLink--><a id="a_comment_author_4019262" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 丰峰锋
这个$PYTHON_HOME就是安装Jython的目录。
另外,注意一点:Python和Jython是2种不同语言实现的Python,只需要安装其中之一就行了。实际上,我们通常说的Python是C语言实现的Python,严格来说应该叫C Python。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#7楼

            <!-- PostDate -->

2018-09-17 15:27

            <!--NameLink--><a id="a_comment_author_4069140" href="https://home.cnblogs.com/u/955142/" target="_blank">廖昫</a><div class="feedbackCon">
兄弟,我也在调用第三方库是提示ImportError: No module named xxx,我不知道该把这个库放哪里,我用pip安装成功了,在spyder都可以调用,但是这边不行,问题在哪里?谢谢
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#8楼

[楼主]

            <!-- PostDate -->

2018-09-18 10:57

            <!--NameLink--><a id="a_comment_author_4069838" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
放在$PYTHON_HOME/Lib/site-packages
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#9楼

            <!-- PostDate -->

2018-09-18 11:02

            <!--NameLink--><a id="a_comment_author_4069849" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
谢谢,我有在这下面都放着,用pip安装的,也试了用Anaconda prompt安装也不行,我还以为是版本问题,安装了不同版本都不行,不知道哪里出了问题,我在spyder里面都可以正常访问,在java里面用PythonInterpreter就报错,够折腾人啊
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#10楼

            <!-- PostDate -->

2018-09-18 11:32

            <!--NameLink--><a id="a_comment_author_4069897" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
如果在Python程序中引用了第三方库,需要将这些被引用的第三方库所在路径添加到系统环境变量中
这句是真的吗?需要配置在系统环境变量?,谢谢
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#11楼

[楼主]

            <!-- PostDate -->

2018-09-18 21:21

            <!--NameLink--><a id="a_comment_author_4070535" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
关于我在代码中的这句注释:
“// 如果在Python程序中引用了第三方库,需要将这些被引用的第三方库所在路径添加到系统环境变量中
// 否则,在执行Python程序时将会报错: ImportError: No module named xxx

至少我在实践的时候发现是这样的,您不妨实验一下。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#12楼

            <!-- PostDate -->

2018-09-19 09:03

            <!--NameLink--><a id="a_comment_author_4070726" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
非常非常感谢兄弟一直在一起帮我解决这个问题
我刚刚配了系统环境变量也不行,
C:\Users\liaomingming\Anaconda3\Lib\site-packages
连C:\Users\liaomingming\Anaconda3\Lib\site-packages\numpy这个都单独放在系统变量还是不行,请问兄弟你是怎么配的?
非常非常感谢
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#13楼

[楼主]

            <!-- PostDate -->

2018-09-19 10:16

            <!--NameLink--><a id="a_comment_author_4070821" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
通过代码添加的啊,不是直接去配置系统的环境变量

PythonInterpreter interpreter = new PythonInterpreter();
PySystemState sys = interpreter.getSystemState();
sys.path.add("D:\\python"); // 在代码中添加程序执行的环境变量路径

支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#14楼

            <!-- PostDate -->

2018-09-19 10:19

            <!--NameLink--><a id="a_comment_author_4070825" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
是的我也这样做了,
sys.path.add("C:\\Users\\liaomingming\\Anaconda3\\Lib\\site-packages\\numpy");
sys.path.add("C:\\Users\\liaomingming\\Anaconda3\\Lib\\site-packages\\psycopg2");
现在出现新的错误
from .porter import PorterStemmer # noqa:F401
SyntaxError: ("'with' will become a reserved keyword in Python 2.6",
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#15楼

[楼主]

            <!-- PostDate -->

2018-09-19 10:43

            <!--NameLink--><a id="a_comment_author_4070864" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
显然,这是新的问题,应该是Python版本的不兼容导致的,这个问题你应该能解决了
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#16楼

            <!-- PostDate -->

2018-09-19 10:52

            <!--NameLink--><a id="a_comment_author_4070880" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
是的,需要找匹配的版本,真是非要坑死人,非常感谢兄弟
兄弟有没用过python作为服务器语言搭建服务器
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#17楼

            <!-- PostDate -->

2018-09-19 11:29

            <!--NameLink--><a id="a_comment_author_4070944" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
我下载了最新的jython,2.7.0这个版本,现在运行报
File "C:\Users\liaomingming\Anaconda3\Lib\site-packages\gensim\utils.py", line 31, in <module>
import multiprocessing
ImportError: No module named multiprocessing
又出现没有module的错,我这个小心脏啊,gensim这个库我才最新安装的,难道每个库包都要一一检查重新再下载!这折腾的要哭瞎
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#18楼

[楼主]

            <!-- PostDate -->

2018-09-19 14:14

            <!--NameLink--><a id="a_comment_author_4071138" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
关于安装包依赖这个,我之前的解决方案是,先安装CPython,把对应的依赖包下载下来,再拷贝到JPython对应的位置。直接通过JPython安装依赖包貌似有时候不成功,不知道原因。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#19楼

            <!-- PostDate -->

2018-09-19 15:07

            <!--NameLink--><a id="a_comment_author_4071227" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
谢谢兄弟一直在不断地指导我,
先安装CPython,把对应的依赖包下载下来,再拷贝到JPython对应的位置。直接通过JPython安装依赖包貌似有时候不成功
这句我没怎么看懂,对应的库是指Cython吗?现在我引用的是numpy这个库,好像跟cython没什么关系吧
资料很不好找,在stackoverflow上面找个两个例子,但是都是问题,也没有正确而答案
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#20楼

[楼主]

            <!-- PostDate -->

2018-09-19 15:57

            <!--NameLink--><a id="a_comment_author_4071367" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
Python语言存在多个版本这个你知道吧?
我们通常所说的Python就是CPython,我这篇博客里面用的是JPython,是Java语言实现的Python。
所以我理解你的场景是在Java中调用Python程序,使用的是JPython(我写的这篇博客主要讲的也是如何在Java中使用JPython)。
也就是说,如果你的场景跟我的一样,我理解你在开发机器上装的是JPython,而不是CPython。我之前的经历是安装JPython之后安装依赖包存在不成功的现象,然后我就安装CPython,通过CPython去下载依赖包,然后再拷贝到JPthon安装的对应位置就解决了。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#21楼

            <!-- PostDate -->

2018-09-19 17:33

            <!--NameLink--><a id="a_comment_author_4071548" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
然后我就安装CPython,通过CPython去下载依赖包,然后再拷贝到JPthon安装的对应位置就解决了
我安装Cython都报错
我是用pip install Cython安装的,你是怎么安装的?
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#22楼

[楼主]

            <!-- PostDate -->

2018-09-19 22:44

            <!--NameLink--><a id="a_comment_author_4071838" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
我感觉你没理解Python存在多个语言版本的含义
CPython安装包下载地址了解一下:https://www.python.org/downloads/windows/
windows下exe文件一步步就安装好了
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#23楼

            <!-- PostDate -->

2018-09-20 09:18

            <!--NameLink--><a id="a_comment_author_4071983" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
是,我有些模糊,我之前安装的是cython吗?就是纯python环境下的,做算法那些。
jython我下过一个安装版,也安装了,也下了一个直接嵌入工程的jar包
你的意思是要我下载一个cython,然后把包拷到jython是吗?因为java运行调用python应该是调用jython,如果这样把cython的包放到jython,他们不冲突吗?一个是java编写实现的一个是c编写实现的
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#24楼

            <!-- PostDate -->

2018-09-20 17:36

            <!--NameLink--><a id="a_comment_author_4072640" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
我安装了一个windows版本的,你的意思是需要重新下载这些第三方包,比如numpy gensim这些第三方库
我试着用pip安装,他提示说已经存在,路径指在Anaconda 3.6.5,因为我有一个Anaconda 3.6.5的版本,这是我用来做深度学习开发的python环境
支持(0) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#25楼

[楼主]

            <!-- PostDate -->

2018-09-21 08:28

            <!--NameLink--><a id="a_comment_author_4073063" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
我建议你先搞清楚Python为什么会存在多个语言版本吧?
我回答你的跟你理解的不是一个东西,毕竟不是面对面沟通。理论上讲,不论安装哪个语言版本的Python,都应该可以正常解决依赖问题。我告诉你的方式可能是一个迂回的解决方式,也可能只适合在我的场景。
我建议你先解决基础的疑问,语言仅仅是工具。
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#26楼

            <!-- PostDate -->

2018-09-21 09:12

            <!--NameLink--><a id="a_comment_author_4073109" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
是,真心感谢兄弟这么一直跟我沟通,早上特意查了为什么python存在这么版本,也算是了解了,其实之前我一直弄错了,之前一直用Anaconda做算法,其实它是Cpython,现在要架构服务器,语言是java,那运行环境肯定是需要用Jpython,只是现在jpython是2.7,算是很低的版本,而Anaconda我的是3.6.5的,首先安装的包版本都不一样,其次我一直在java里面调用Anaconda的python.exe去执行,肯定不多,所以现在其实两件事情,安装Jpython,找各自对应的库包版本
真感谢兄弟,我相信这个问题肯定也困扰很多需要用java调用python和单纯用python做算法的人,经过兄弟这么多耐心地回答我的问题,也给遇到同样问题的人提供解决方案。
支持(1) 反对(0)
            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#27楼

[楼主]

            <!-- PostDate -->

2018-09-21 10:30

            <!--NameLink--><a id="a_comment_author_4073257" href="https://www.cnblogs.com/nuccch/" target="_blank">2Simple</a><div class="feedbackCon">
@ 廖昫
对你有帮助就好,不用客气~
支持(0) 反对(0)

https://pic.cnblogs.com/face/722072/20190303092130.png

            </div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;
            </div><!-- Title -->

#28楼

    <span id="comment-maxId" style="display:none">4073538</span><span id="comment-maxDate" style="display:none">2018/9/21 下午3:06:10</span><!-- PostDate -->

2018-09-21 15:06

            <!--NameLink--><a id="a_comment_author_4073538" href="https://www.cnblogs.com/lmm361027282/" target="_blank">廖昫</a><div class="feedbackCon">
我知道我这边有一个很严重的问题,就是a.py无法调用b.py,
就像你写的那个from calculator_clazz import Calculator,这句都会说找不到calculator_clazz,同样在numpy也存在调用另外一个py文件,肯定说找不到
你是什么环境?为什么可以调用另外的.py文件?我是win10,会不会这个问题?如果这个解决,那基本上问题解决了
支持(0) 反对(0)
            </div></div></div>
刷新评论刷新页面返回顶部
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【活动】京东云服务器_云主机低于1折,低价高性能产品备战双11
【推荐】天翼云双十一提前开抢,1核1G云主机3个月仅需59元
【活动】魔程社区技术沙龙训练营—大数据主题专场等你来报名
【优惠】腾讯云 11.1 1智惠上云,爆款提前购与双11活动同价
【福利】个推四大热门移动开发SDK全部免费用一年,限时抢!
相关博文:
· Python与Java之间的相互调用——Jython
· 在java中调用python
· 在Java中调用Python代码
· python系列一——python特点以及和java不同的运行机制
· 【一:定义】python 简介
» 更多推荐...
    <div id="google_ads_iframe_/1090369/C2_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/C2_0" title="3rd party ad content" name="google_ads_iframe_/1090369/C2_0" width="468" height="60" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" srcdoc="" style="border: 0px; vertical-align: bottom;" data-google-container-id="2" data-load-complete="true"></iframe></div></div>
</div>
<div id="under_post_kb">

最新 IT 新闻:
· 李国庆已向法院提交诉状和俞渝离婚 :要求平分当当网股权
· 1024,秃如其来的码农图鉴
· 专访华为何刚:华为Mate30 5G系列将成“核弹级爆款”
· NASA计划2023年建成LLISSE金星表面探测器并展开测试
· 高速公路告别“重名”现象,高德百度等协同更新数据
» 更多新闻...

java中调用python相关推荐

  1. 在Java中调用Python

    写在前面 参考:https://www.cnblogs.com/nuccch/p/8435693.html 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然 ...

  2. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  3. 在Java中调用Python,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...

  4. java怎么调用python_如何在Java中调用Python代码

    Jython(原JPython),是一个用2113Java语言写的Python解释5261器.在没有第三方模块的情况下4102,通常选择利用Jython来调用1653Python代码,它是一个开源的J ...

  5. java能调用python吗_如何使用运行时在Java中调用python程序 - java

    我想用来自Java的参数调用python程序.但是我的输出是空白.代码在这里. Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public ...

  6. Java:在Java中调用python文件执行

    目录 一.Java内置Jpython库(不推荐) 1.1 下载与使用 1.2 缺陷 二.使用Runtime.getRuntime()执行脚本⽂件 2.1 使用 2.2 缺陷 三.利用cmd调用pyth ...

  7. 在Spark Scala/Java应用中调用Python脚本,会么?

    摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...

  8. 教你如何在Spark Scala/Java应用中调用Python脚本

    摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...

  9. 【Python】如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

最新文章

  1. 《Windows网络与通信程序设计(第3版)》——1.4 网络应用程序设计基础
  2. Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  3. table数据表 边框特效
  4. Autodesk招聘开发咨询顾问(北京或上海),需要内推的扔简历过来啊
  5. 1 Selenium Python 基础
  6. ETDM:基于显式时间差分建模的视频超分辨率(CVPR 2022)
  7. [Vue.js]实战 -- 电商项目(八)
  8. 【elasticsearch】 elasticsearch document 路由 (routing) 到shard
  9. 7723java梦游游戏,渠道SDK登录
  10. import pycharm setting_Pycharm不能正常使用的常见问题
  11. 他帮 10 多家公司变身独角兽,总结出一份“成功”清单
  12. 《C++游戏编程入门(第4版)》——1.2 编写第一个C++程序
  13. CentOS 6.5安装配置Nginx
  14. 【转】使用并口控制笔记本软驱中的电机
  15. 使用Arduino和水流传感器进行流速和流量测量
  16. 淘宝APP用户行为数据分析
  17. 喜欢蓝蓝的天空白白的云。这首《 Blue Skies》就是啦。
  18. 深度学习领域,你心目中 idea 最惊艳的论文是哪篇?
  19. 软测—直播教学 黑盒测试
  20. liferay的几个配置

热门文章

  1. php批量导出pdf文件大小,php完美导出pdf,pdf合并批量导出
  2. modin pandas 加速
  3. 条件随机场(CRF) - 2 - 定义和形式
  4. LeetCode简单题之石头与宝石
  5. 最新Maven及Tomcat配置~(IDEA版 试错无数!)
  6. 鸿蒙OS:万物互联,方舟Compiler
  7. TVM 各个模块总体架构
  8. 提示和技巧:光线跟踪最佳实践
  9. 半导体群聚、虚拟垂直、整合
  10. 2021年大数据Spark(四十三):SparkStreaming整合Kafka 0.10 开发使用