博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jython:java调用python文件之第三方包路径问题
阅读量:7062 次
发布时间:2019-06-28

本文共 2687 字,大约阅读时间需要 8 分钟。

本文转载自:

本方法解决python代码的可移植性,不需要在新机器上配置python环境,只通过安装jython的方式将python代码嵌入java工程

1. Jython如何安装

下载地址:。下载需要积分,如果无积分,可联系楼主。

傻瓜式下一步安装方式,路径最好和工程选在同一目录下。

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传入。

你可能感兴趣的文章
jquery获取表单数据方法$.serializeArray()获取不到disabled的值
查看>>
【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名
查看>>
【M15】了解异常处理(exception handling)的成本
查看>>
一起谈.NET技术,Silverlight 游戏开发小技巧:升级和传送点特效1
查看>>
一起谈.NET技术,SharePoint 2010中的单点登录
查看>>
vue2的keep-alive的总结
查看>>
在部署asp.net时,会出现的两种情况,记下来,以方便以后解决问题。
查看>>
(转)http协议
查看>>
C#枚举-避免不合理赋值
查看>>
Setting up Unicorn with Nginx
查看>>
PHP——内测:联系人管理
查看>>
How can I create an executable JAR with dependencies using Maven?
查看>>
delphi提示错误行号之Assert(断言)
查看>>
springmvc 导出excel
查看>>
自行控制loadrunner的socket协议性能测试 (转)
查看>>
【ASP】简单Url编码和Url解码实例
查看>>
人工智能火了,为啥医疗成为最先受益者?
查看>>
雷军带领小米老员工公园步行 称这些人是小米最宝贵财富
查看>>
滴滴公布自查进展:免去黄洁莉顺风车事业部总经理职务
查看>>
中国PPP管理库项目累计投资额13.2万亿元
查看>>