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

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

解决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

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

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

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

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

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

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

在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

Python中每次处理一个字符的5种方法

目的 对字符串的每个字符进行处理,其实每个字符(Char)就是一个长度为1的字符串. 方法 1.使用内建函数list() 复制代码 代码如下: >>> A_string='Python' >>> char_list=list(A_string) >>> char_list ['P', 'y', 't', 'h', 'o', 'n'] 2.使用for语句对字符串进行遍历 复制代码 代码如下: >>> for c in A_string:

Python中模拟enum枚举类型的5种方法分享

以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码 代码如下: # way1 class Directions:     up = 0     down = 1     left = 2     right =3     print Directions.down # way2 dirUp, dirDown, dirLeft, dirRight = range(4) print dirDown # way3 import collections dircoll=collections.

Python中使用django form表单验证的方法

一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Form</title> </head> <body> <div> <for

Python中文件的写入读取以及附加文字方法

今天学习到python的读取文件部分. 还是以一段代码为例: filename='programming.txt' with open(filename,'w') as file_object: file_object.write("I love programming.\n") file_object.write("I love travelling.\n") 在这里调用open打开文件,两个实参,一个是要打开的文件名称,第二个实参('w')是告诉Python我们

python中requests爬去网页内容出现乱码问题解决方法介绍

最近在学习python爬虫,使用requests的时候遇到了不少的问题,比如说在requests中如何使用cookies进行登录验证,这可以查看这篇文章.这篇博客要解决的问题是如何避免在使用requests的时候出现乱码. import requests res=requests.get("https://www.baidu.com") print res.content 以上就是使用requests进行简单的网页请求数据的方式.但是很容易出现乱码的问题. 我们可以通过在网页上右击查看

python中获得当前目录和上级目录的实现方法

获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file__ 为当前文件, 若果在ide中运行此行会报错,可改为 #d = path.dirname('.') 获得某个路径的父级目录: parent_path = os.path.dirname(d) #获得d所在的目录,即d的父级目录 parent_path = os.path.dirname(parent_path) ##获得parent_p

python中json格式数据输出的简单实现方法

主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info["code"]=1 info["id"]=1900 info["name"]='张三' info["sex"]='男' list=[info,info,info] data={} data["code"]=1 data["id"]=190

Python中json格式数据的编码与解码方法详解

本文实例讲述了Python中json格式数据的编码与解码方法.分享给大家供大家参考,具体如下: python从2.6版本开始内置了json数据格式的处理方法. 1.json格式数据编码 在python中,json数据格式编码使用json.dumps方法. #!/usr/bin/env python #coding=utf8 import json users = [{'name': 'tom', 'age': 22}, {'name': 'anny', 'age': 18}] #元组对象也可以

详解python中字典的循环遍历的两种方式

开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python3中,下面两种方法都是通用的. 1. 只对键的遍历 一个简单的for语句就能循环字典的所有键,就像处理序列一样: d = {'name1' : 'pythontab', 'name2' : '.', 'name3' : 'com'} for key in d: print (key, ' value