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类,建好完成 ...
随机推荐
- 【javascript】数据结构-队列
<!DOCTYPE html> <html> <head> <title>queue</title> <meta charset=&q ...
- linux下递归删除指定后缀名的文件
以删除当前目录到所有子目录下的后缀名为rej的文件为例: find . -name "*.rej" |xargs rm -f
- Anaconda中常用的用法
Anaconda中常用的用法 conda 是开源包(packages)和虚拟环境(environment)的管理系统. packages 管理: 可以使用 conda 来安装.更新 .卸载工具包 ,并 ...
- [转]Python的getattr(),setattr(),delattr(),hasattr()
getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...
- /etc/rc.local 与 /etc/profile
1.用户自己源码安装的软件组要自启动,可以在/etc/rc.local中配置,rc.loacl 是rc.d/rc.local的一个软连接.rc.local -> rc.d/rc.local 2. ...
- Redis哨兵(sentinel)
介绍 Redis的sentinel主要是用来管理多个Redis服务器,sentinel负责(1)监控主服务器和从服务器的运行状态(2)主服务器运行故障时自动切换其中一台从服务器为主服务器 Sentin ...
- Eclipse插件Fat Jar
1.安装 1)Eclipse在线更新方法 Help > Install New Software > Add, name:Fat Jar location:http://kurucz-gr ...
- key寻址算法
分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 hash 算法 来了一个 ...
- 强大的XML
2018-04-23 20:29:26 XML:Extensible Markup Language,也就是可扩展标记语言.XML和HTML格式是古老的标记通用语言SGML的衍生语言. XML文件是可 ...
- 不能用Xming连接到 Centos 7
修改/etc/gdm/custom.conf 之后, Centos 6是没有问题的. 可是Centos 7 不行. 根据这个连接,运行firewall-config,把网络改到trusted级别, 能 ...