Jython:java调用python文件之第三方包路径问题
本文转载自:http://blog.csdn.net/ztf312/article/details/51338060
本方法解决python代码的可移植性,不需要在新机器上配置python环境,只通过安装jython的方式将python代码嵌入java工程
1. Jython如何安装
下载地址:jython_installer-2.5.0.jar。下载需要积分,如果无积分,可联系楼主。
傻瓜式下一步安装方式,路径最好和工程选在同一目录下。
2. 运行python代码
举个简单例子,安装好java环境及eclipse之后,copy如下代码即可运行。注释部分为运行文件的方式,需要新建文件后去掉注释执行。
import java.io.IOException;
import org.python.util.PythonInterpreter;
public class test {
public static void main(String args[]) throws IOException {
PythonInterpreter interpreter = new PythonInterpreter();
// 运行python语句
interpreter.exec("a = \"hello, Jython\"");
interpreter.exec("print a");
// 执行python文件
// interpreter.exec("filepy = \"E:\\test.py\"");
// interpreter.execfile(filepy); ///执行python py文件
// filepy.close();
}
}
3. 处理第三方包
在文件运行方式中,
第一种情况:如果.py文件中包含同一目录的自定义包,则在eclipse工程下可正常调用。
第二种情况:如果包含第三方包,需要拷贝到当前目录下。
第三种情况:由于路径问题无法调用。Jython/lib文件下有大量第三方包,如os, re, __future__,重复拷贝费时费力,这时可手动修改path路径。(推荐)
修改路径有两种方式:
(1) Java方式
import org.python.core.Py;
import org.python.core.PySystemState;
System.out.println(sys.path.toString()); // previous
PySystemState sys = Py.getSystemState();
sys.path.add("E:\\sacaapm-paserver\\src-python\\jython\\Lib");
System.out.println(sys.path.toString()); // later
将代码嵌入part 2代码,得到完整代码后执行,可以看到前后路径发生变化。
(2) python方式
interpreter.exec("import sys");
interpreter.exec("print sys.path");
(3) 灵活运用以上两种方式或其组合形式。
当import sys时报出“sys模块不存在”的错误,建议使用第一种。
完整代码如下:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; import org.python.core.Py;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter; public class test {
public static void main(String args[]) throws IOException {
PythonInterpreter interpreter = new PythonInterpreter();
PySystemState sys = Py.getSystemState();
sys.path.add("E:\\src-python\\jython\\Lib");
interpreter.exec("import sys");
interpreter.exec("print sys.path");
interpreter.exec("path = \"E:\\src-python\\jython\\Lib\"");
interpreter.exec("sys.path.append(path)");
interpreter.exec("print sys.path");
interpreter.exec("a=3; b=5;");
InputStream filepy = new FileInputStream("E:\\input.py");
interpreter.execfile(filepy);
filepy.close();
}
}
运行结果:
['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib']
['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib', 'E:\\src-python\\jython\\Lib']
a/b= 0.6
E:\\input.py文件代码:
from __future__ import division
print "a/b=",a/b
其中变量a, b的值由java传入。
Jython:java调用python文件之第三方包路径问题的更多相关文章
- Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...
- (转)java调用python脚本
这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...
- 通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- [Java/Python] java调用python脚本问题记录
Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...
- java调用python的几种用法(看这篇就够了)
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...
- Java 调用python说明文档
Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...
- java调用python程序以及向python程序传递参数
在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...
- java调用python脚本并向python脚本传递参数
1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...
随机推荐
- mysql安装不上怎么办 mysql安装失败原因和解决方法
困难1:MySQL 5.1 安装过程中报apply security setting错误 1.卸载MySQL. 2.删除目录 C:\Documents and Settings\All Users\A ...
- 微信小程序纯css制作圆形进度条所遇到的问题
wrapBox:最外层盒子,背景色为进度条的颜色 leftBox/rightBox:半宽等长 左/右浮动的盒子,背景色为灰色 roundMask:居中的盒子 用来遮盖leftBox和rightBox ...
- git commit进行代码检查
使用Ant Design Pro提交代码的时候进行代码检查报了很多错 git commit --no-verify -m "commit" 就可以跳过代码检查 或者在项目里新建 ...
- html中用变量作为django字典的键值
若字典为dic={'name': Barbie, 'age': 20},则在html中dic.name为Barbie,dic.age为20. 但若字典为dic={'Barbie': 1, 'Roger ...
- Lucene Scoring 评分机制
原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 ...
- linux 网络测试命令 长期更新
一.网络测试命令 1.测试 网络连接 发送两包后停发 [oracle@hadoop ~]$ PING www.a.shifen.com (() bytes of data. bytes from tt ...
- Hadoop1.x HDFS系统架构
1. HDFS中的一些概念1.1 数据块1.2 NameNode和DataNode1.2.1 管理者:Namenode1.2.1 工作者:Datanode1.3 Secondary Namenode1 ...
- Redis集群搭建笔记
系统为CentOS7,创建9001-9006 6个文件夹,复制 redis-server redis.conf 文件到6个新文件夹下 redis.conf文件配置如下: port 9001 daemo ...
- 如何在JavaScript中手动创建类数组对象
前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...
- Linux:自动获取静态IP地址,清空iptable,修改selinux脚本
自动获取静态IP地址,清空iptable,修改selinux脚本 环境:VMware 平台:centos6.8全新 功能: 1)应用ifconfig -a,route -n,cat /etc/reso ...