Jython:Java如何传值给Python

想在Java工程中调用Python脚本,最关键的是python脚本需要使用Java实时传递过来的变量。因此麻烦了,到处找教程。

中文教程为零,还好有Stack Over Flow,输入关键字:jython java passing  variable topython,果真找到一个案例。以下是翻译内容:

我用的是jython2.7.0,想要把java命令行的参数通过jython传递给Python脚本,结果完全不符合预期,代码如下:

String[] arguments ={"arg1", "arg2", "arg3"};
PythonInterpreter.initialize(props,System.getProperties(), arguments);
org.python.util.PythonInterpreterpython = new org.python.util.PythonInterpreter();
StringWriter out = newStringWriter();
python.setOut(out);
python.execfile("myscript.py");
String outputStr =out.toString();
System.out.println(outputStr);

代码运行出现的问题是:传值失败。也就是说没有正确调用接口。下面是两个回答(未测试):

作者补充回复:

String[] arguments ={"myscript.py", "arg1", "arg2","arg3"};
PythonInterpreter.initialize(System.getProperties(),System.getProperties(), arguments);
org.python.util.PythonInterpreterpython = new org.python.util.PythonInterpreter();
StringWriter out = newStringWriter();
python.setOut(out);
python.execfile("myscript.py");
String outputStr =out.toString();
System.out.println(outputStr);

注意第一行,作者是通过arg[0]把脚本传入的。

其他人回复:

import org.python.core.Py;
import org.python.core.PyException;
import org.python.core.PyObject;
import org.python.core.PyString;
importorg.python.core.__builtin__;
importorg.python.util.PythonInterpreter;

public class JythonTest {

    public static void main(String[] args) {
        PythonInterpreter interpreter = newPythonInterpreter();
        String fileUrlPath ="/path/to/script";
        String scriptName ="myscript";
        interpreter.exec("importsys\n" + "import os \n" + "sys.path.append('" +fileUrlPath + "')\n"+ "from "+scriptName+" import *\n");
        String funcName ="myFunction";
        PyObject someFunc =interpreter.get(funcName);
        if (someFunc == null) {
            throw new Exception("Could notfind Python function: " + funcName);
        }
       try {
            someFunc.__call__(newPyString(arg1), new PyString(arg2), new PyString(arg3));
        } catch (PyException e) {
            e.printStackTrace();
        }
    }
}

注意对方在directory /path/to/script 目录下建立一个叫做myscript.py 的python脚本:

def myscript(arg1,arg2,arg3):
    print "calling python function withparamters:"
    print arg1
    print arg2
    print arg3

亲测:

importjava.io.IOException;
importorg.python.util.PythonInterpreter; 

public class test {
    public static void main(String[] args) throws IOException {
          int[] arg = {3,6};
         PythonInterpreter.initialize(System.getProperties(),System.getProperties(), new String[0]);
         PythonInterpreter interpreter = new PythonInterpreter();
         interpreter.exec("a="+ arg[0]+ "\n");
         interpreter.exec("b="+arg[1] + "\n");
         interpreter.exec("print b/a");
          // pass the address
         String txt_path = "\\python\\sample.txt";
         interpreter.exec("txt_path = \"" + txt_path + "\"");
         interpreter.exec("print txt_path");
    }//main
}

参考问答:how to passarguments to python script in java using jython

时间: 2024-07-31 16:04:06

Jython:Java如何传值给Python的相关文章

java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全

人在囧途——Java程序猿学习Python

引言 LZ之前其实一直对python都很好奇,只是苦于平时没有时间去了解它,因此趁着51假期这个机会,便迫不及待的开始了自己的探索.作为一个标准的Java程序猿,在了解python的过程当中,LZ遇到了很多囧事,接下来LZ就一一给大家说道说道.本文纯属看个乐子,非python教学. 囧事一:eclipse插件安装篇 由于LZ习惯了使用eclipse进行开发,因此对python的研究,还是希望可以在eclipse上进行试验.那么第一件事,自然是安装python的eclipse插件,于是百度.goo

【Python】Java程序员学习Python(五)— 函数的定义和使用

不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍,方法的目的还是重用和封装 一.方法的定义 方法的定义使用关键词def来定义,定义格式如下: def 方法名(参数定义): 方法体 方法名:方法名的规范同变量名规范一样 参数定义:比较复杂,后面会进行讲解 冒号:这个类似于Java的{},必不可少 方法体:方法实现的功能在此定义即可 简单的例子: #定

Java是传值还是传引用?

(#)背景  最近收到以前学弟提出的疑问,就是java到底传的是引用还是值(按他的说法形参和实参),其实本来不像解释的,因为我觉得这是一个很简单的概念,当你看见的东西解释 不了的时候,你应该做的就是这些数据在java内存中的表现是什么呢,所以我给他的建议就是去看看这些在内存中都是什么样的,今天来自己解释一下吧 (#)例子 看了上面的小例子,首先你会觉得这个到底传的是什么呢?值好像也不全是,引用好像也解释不了,其实这个时候就很简单了,我们分析一下二者内存结构, (1)对于int这种基本类型,我们知

Java、C++、Python、Ruby、PHP、C#和JavaScript的理解

Java.C++.Python.Ruby.PHP.C#和JavaScript和日本动漫里的那些大家熟悉的动漫人物结合起来.依据他们的身世.个人经历来生动的表达各编程语言的发展历程.原文内容例如以下: Java 宛如宫泽贤治的<不畏风雨>中出现的.性格木讷的女孩子.从小就因为迟钝和大食量等特征被别人当作笨蛋,从小学入学開始进入田径部.坚持跑步.在中长跑中常常取得好成绩.给人以活泼的印象.是十分努力的女孩子. 她的家境并不算好.父亲Sun是有才干的艺术家,但不擅长理財.在她14岁的时候由于苦于借债

【转载】Java是传值还是传引用

1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = &q

6月29日云栖精选夜读:Java、PHP、Python、JS 等开发者都如何绘制统计图

原文链接 目前很多程序员绘图基本上都是采用后端生成数据传递给前端,然后前端将数据渲染到绘图库上面进行显示,从而得到我们最后看到的各种图,但是有时候,我们发现需要传递的数据很多很多,那么这个时候如果将数据传递给前端进行分析并展示的话是非常慢的,所以有必要在后端进行各种统计图的生成,下面我们就来聊聊各种程序员都是怎么进行图制作的? 热点热议 Java.PHP.Python.JS 等开发者都如何绘制统计图 作者:琴瑟琵琶 程序员:感觉技术停滞时,该怎么办? 作者:琴瑟琵琶 Linux 之父 Linus

[转] Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

转载自:http://www.dengchuanhua.com/132.html 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 该项目地址为:https://github.com/twitter/snowflake是用Scala实现的. python版详见开源项目https://github.com/erans/pysnowflake.

java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch:5.2.0 4.Linux 5.Python 6.maven 二.maven坐标: <!--java连接ulinix脚本架包--> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>