Java程序中实现调用Python脚本的方法详解

本文实例讲述了Java程序中实现调用Python脚本的方法。分享给大家供大家参考,具体如下:

在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法。

1、在Eclipse中新建Maven工程;

2、pom.xml文件中添加如下依赖包之后update maven工程;

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

3、编写如下测试代码;

import org.python.util.PythonInterpreter;
public class JpythonScript {
 public static void main(String args[]) {
  PythonInterpreter interpreter = new PythonInterpreter();
  interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
  interpreter.exec("print days[1];");
 }
}

4、测试:

出现如下错误:

console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.
Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site
Determine if the following attributes are correct:
  * sys.path: ['...python\\jython\\2.7.0\\Lib', '__classpath__', '__pyclasspath__/']
    This attribute might be including the wrong directories, such as from CPython
  * sys.prefix:***\jython\2.7.0
    This attribute is set by the system property python.home, although it can
    be often automatically determined by the location of the Jython jar file
You can use the -S option or python.import.site=false to not import the site module

5、问题解决:

重构代码如下:

import java.util.Properties;
import org.python.util.PythonInterpreter;
public class JpythonScript {
 public static void main(String args[]) {
  Properties props = new Properties();
  props.put("python.home", "path to the Lib folder");
  props.put("python.console.encoding", "UTF-8");
  props.put("python.security.respectJavaAccessibility", "false");
  props.put("python.import.site", "false");
  Properties preprops = System.getProperties();
  PythonInterpreter.initialize(preprops, props, new String[0]);
  PythonInterpreter interpreter = new PythonInterpreter();
  interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
  interpreter.exec("print days[1];");
 }
}

6、编译成功。

7、解决问题参考:

http://bugs.jython.org/issue2355

补充:jpython抛错Cannot import site module的解决方法

Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site

public class JpythonScript {
  public static void main(String args[]) {
    Properties props = new Properties();
    props.put("python.import.site", "false");
    Properties preprops = System.getProperties();
    PythonInterpreter.initialize(preprops, props, new String[0]);
    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
    interpreter.exec("print days[1];");
  }
// 进行复杂类接受处理
Map<String, Object> res = new HashMap<String, Object>();
res.put("1", "Danny");
res.put("2", "Fanny");
PythonInterpreter interpM = new PythonInterpreter();
interpM.execfile("./src/com/DataDeal.py");
PyFunction pyFunctionM = (PyFunction) interpM.get("main", PyFunction.class);
Map<PyObject, PyObject> tableM = new HashMap<PyObject, PyObject>();
tableM.put(new PyString("conf"), PyJavaType.wrapJavaObject(res));
PyDictionary pydM = new PyDictionary(tableM);

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

时间: 2018-03-27

python调用外部程序的实操步骤

在python的使用中,有时也不得不调用一下外部程序,那么如何调用外部程序: 首先,我们要启动python软件,使用的是python2.7的版本,具体如图: 在外部调用中主要要用到一个os标准模块,下面介绍一下关于os模块的函数,具体如图所示: 假设我们调用电脑上的浏览器(我使用的是搜狗浏览器),那么我们先找找浏览器安装的路径位置,如图所示: 我们将步骤三种找到的路径位置复制,那么我们可通过如下的代码实现调用浏览器,具体如图所示: 当然我们还可以通过下面的一个函数调用,具体如图所示:

go和python调用其它程序并得到程序输出

在c语言中可以用system函数调用系统命令并得到输出,通过输出重定向也可以将程序执行的输出保存到文件以供使用,但用起来不是很方便.我这里介绍下用python和go语言的实现方式,可以将其它程序的输出直接保存成变量供程序使用. 下面的示例用的是ls命名,需要安装MinGW,并将"C:\MinGW\msys\1.0\bin"加入环境变量. 一.用python调用其它程序,并得到输出 示例代码: 复制代码 代码如下: import osvar = os.popen('ls -l').rea

Python调用C++程序的方法详解

前言 大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Python调用C++模块的需求,下面列举出集中c++代码导出成Python接口的几种基本方法,一起来学习学习吧. 原生态导出 Python解释器就是用C实现,因此只要我们的C++的数据结构能让Python认识,理论上就是可以被直接调用的.我们实现test1.cpp如下 #include <Pytho

在python中实现调用可执行文件.exe的3种方法

方法一. os.system() 会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来 import os main = "project1.exe" r_v = os.system(main) print (r_v ) 方法二. commands.getstatusoutput() 会保存可执行程序中的打印值和主函数的返回值,但不会将执行过程中要打印的内容打印出来 import subprocess import os main = "proje

java 直接调用python脚本,并传递参数代码实例

最近陆续用python写了很多文件处理脚本,虽然功能都比较简单 ,但还是感觉到python对文件处理的简洁高效 ,越发觉得java的语法相当的繁琐~ 接到个需求处理ftp数据接口 .所以想把python脚本也用上.java代码定时扫描ftp数据仓库 ,调用python脚本入库. 直接采用java执行系统命令的方式 @Async public void readFileByPython(List<String> filePaths) throws FileNotFoundException {

Python中调用其他程序的方式详解

前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程, 可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数.下面介绍4种方式: 1.os.system()函数 os模块中的system()函数可以方便地运行其他程序或者脚本,模式如下: os.system(command):command:

解决Python3 被PHP程序调用执行返回乱码的问题

因为有一部分程序是 Python 写的,所以需要 PHP 调用 Python 程序返回数据,使用 exec 返回的是乱码 $data = "Geek程序员" $get = exec(/usr/bin/python3 main.py $data); 所以载调用 Python 程序之前需要转码 $data = "Geek程序员" $data = urlencode($data) $get = exec(/usr/bin/python3 main.py $data); m

解决Python3用PIL的ImageFont输出中文乱码的问题

今天在用python3+ImageFont输出中文时,结果显示乱码 # coding:utf-8 from PIL import Image, ImageDraw, ImageFont image= Image.new('RGB', (559, 320),(255,255,255)) draw = ImageDraw.Draw(image) # draw.text() font = ImageFont.truetype("arial", 40, encoding="unic&

PHP调用存储过程返回值不一致问题的解决方法分析

本文实例讲述了PHP调用存储过程返回值不一致问题的解决方法.分享给大家供大家参考,具体如下: 今天遇一个同学聊存储过程返回值经常得到意外的值为null, 因为白天有事,晚上给做一个实验放在这里供有相应问题的同学查看一下. 存储过程: delimiter// createprocedureusp_s2(outpar1int) begin selectinet_ntoa(ip),portfromproxy_listlimit5; selectcount(*)intopar1fromproxy_lis

JS动态添加元素及绑定事件造成程序重复执行解决

前言 本文主要给大家分享一下前段时间遇到的bug,这个Bug是关于jquery 的on方法绑交互事件,类似于$('#point').on('click','.read-more',function () {})这样的代码造成的程序重复执行,很多人在文章里写到了,也说了用off方法来解绑,但都未能点出问题的本质,几乎都忽略了问题的本质其实是事件委托造成的. 话不多说,上点天天看到的代码: 第一种:   $(document).on('click', function (e) { consol.lo

微信小程序调用wx.getImageInfo遇到的坑解决

这几天做到微信小程序详情页分享的功能,需要把原页面的一些参数带到分享页,然后在分享页需要获取图片的宽高等基本信息. 1.先说分享传参的方式: 在onShareAppMessage方法里面返回的path里面可以带参数传过去,具体传参的方式有两种,一种是可以传对象(需要把JSON对象stringiny),另外一种是通过一般的参数拼接的方式一个个拼. 代码: onShareAppMessage: function (res) { let data = this.data; let shareParam

解决js相同的正则多次调用test()返回的值却不同的问题

代码是这样的: var reg = /^1[345678][0-9]{9}$/g; console.log(reg.test(15328044636)); console.log(reg.test(15328044636)); 会发现控制台打印的数据却是: true false 问题原因 这是因为正则reg的g属性,设置的全局匹配.RegExp有一个lastIndex属性,来保存索引开始位置. 上面的问题,第一次调用的lastIndex值为0,到了第二次调用,值变成了11. var reg =

关于通过java调用datax,返回任务执行的方法

DATAX DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.TableStore(OTS).MaxCompute(ODPS).DRDS 等各种异构数据源之间高效的数据同步功能. datax的详细介绍 请参考 DataX-Introduction 引言 因为业务需要,需要使用到datax把数据从文本写入到数据库,原来的做法都是使用python通过datax.py去调用脚本

解决微信小程序调用moveToLocation失效问题【超简单】

上图所示,mapUpdated表示地图加载完成后,再初始化数据. 为什么moveToLocation失败? 第一:可能你的ID取错了: 第二:调用moveToLocation时,必须需要调用wx.getLocation,并且用户授权后,才能使用moveToLocation方法 总结 以上所述是小编给大家介绍的解决微信小程序调用moveToLocation失效问题[超简单],希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持! 如果你觉得本文

Python3之外部文件调用Django程序操作model等文件实现方式

我就废话不多说啦,还是直接看代码吧! import os import sys import django sys.path.append(r'C:\Users\Administrator\PycharmProjects\your projectname') os.chdir(r'C:\Users\Administrator\PycharmProjects\your projectname') os.environ.setdefault("DJANGO_SETTINGS_MODULE"

Python3 模块、包调用&路径详解

如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Python标准库 2.第三方模块 3.应用程序自定义模块 ''' # import example # 调用example模块 # from example import example # 调用example模块中的一个example方法 ''' 博客园 Infi_chu ''' ''' 包的特点: 1