使用 Jython 将参数从 Java 传递到 Python
Passing parameters from Java to Python using Jython
我正在使用 Jython 将字符串值传递给 python 脚本。在我的程序中,我多次这样做。但是,在测试期间我 运行 查看发送参数的 class 是否正常工作,我看到 python 脚本输出与初始输入相同的字符串值。
这里是 Java class:
public class SendToCal
{
PythonInterpreter interp = null;
StringWriter clout = null;
String [] arguments = null;
private String start=null,end=null,subject = null;
Properties props = new Properties();
public SendToCal(String start,String end, String subject)
{
try{
setInputs(start,end,subject);
arguments = getInputs(start,end,subject);
//---------------------------------------------
//---------------trying out jython test--------
props.setProperty("python.path","C:\folder\where\I\have\stuff\2.7-b1\Lib', '__classpath__', '__pyclasspath__/");
PythonInterpreter.initialize(System.getProperties(), props,arguments);
this.interp = new PythonInterpreter();
clout = new StringWriter();
interp.setOut(clout);
interp.execfile("C:\folder\to\file\pyscript.py");
String outputStr = clout.toString();
System.out.println(outputStr);
clout.close();
}catch(IOException ex)
{
ex.printStackTrace();
}
}
public void setInputs(String start, String end, String sub)
{
this.start = start;
this.end = end;
this.subject = sub;
}
public String[] getInputs(String start, String end, String sub)
{
String [] arr = {this.start,this.end,this.subject};
return arr;
}
public static void main(String[] args) throws InterruptedException
{
String st2 = 2018+"-"+ 8 +"-"+ 6+ " " +"12:00";
String en2 = 2018+"-"+ 8 +"-"+ 6+ " " +"11:59";
String su2 = "YAY PYTHON AGAIN!!";
new SendToCal(st2, en2, su2);
TimeUnit.SECONDS.sleep(1);
String st = 1999+"-"+ 7 +"-"+ 17+ " " +"12:00";
String en = 1999+"-"+ 7 +"-"+ 17+ " " +"11:59";
String su = "YAY PYTHON!!";
new SendToCal(st, en, su);
}
}
此外,下面是我的 python 脚本:
import sys
def pyscript(arg1,arg2,arg3):
print ("calling python function with parameters:")
print arg1
print arg2
print arg3
pyscript(sys.argv[0],sys.argv[1],sys.argv[2])
我的问题是,当我使用两个或多个完全不同的字符串数组调用 Java 构造函数时,python 的输出是第一个数组输入的副本。感谢任何帮助。
我得到以下输出:
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
我预计:
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
calling python function with parameters:
1999-7-17 12:00
1999-7-17 11:59
YAY PYTHON AGAIN!!
PythonInterpreter.initialize()
方法只能调用一次。它在你的程序中被调用了两次,第二次,sys.argv
没有更新。
解决此问题的方法是将 pyscript.py 用作模块并调用模块中定义的函数。
将 interp.execfile("pyscript.py");
替换为如下内容:
interp.exec("from pyscript import pyscript");
PyObject func = interp.get("pyscript");
func.__call__(new PyString(start), new PyString(end), new PyString(subject));
我正在使用 Jython 将字符串值传递给 python 脚本。在我的程序中,我多次这样做。但是,在测试期间我 运行 查看发送参数的 class 是否正常工作,我看到 python 脚本输出与初始输入相同的字符串值。
这里是 Java class:
public class SendToCal
{
PythonInterpreter interp = null;
StringWriter clout = null;
String [] arguments = null;
private String start=null,end=null,subject = null;
Properties props = new Properties();
public SendToCal(String start,String end, String subject)
{
try{
setInputs(start,end,subject);
arguments = getInputs(start,end,subject);
//---------------------------------------------
//---------------trying out jython test--------
props.setProperty("python.path","C:\folder\where\I\have\stuff\2.7-b1\Lib', '__classpath__', '__pyclasspath__/");
PythonInterpreter.initialize(System.getProperties(), props,arguments);
this.interp = new PythonInterpreter();
clout = new StringWriter();
interp.setOut(clout);
interp.execfile("C:\folder\to\file\pyscript.py");
String outputStr = clout.toString();
System.out.println(outputStr);
clout.close();
}catch(IOException ex)
{
ex.printStackTrace();
}
}
public void setInputs(String start, String end, String sub)
{
this.start = start;
this.end = end;
this.subject = sub;
}
public String[] getInputs(String start, String end, String sub)
{
String [] arr = {this.start,this.end,this.subject};
return arr;
}
public static void main(String[] args) throws InterruptedException
{
String st2 = 2018+"-"+ 8 +"-"+ 6+ " " +"12:00";
String en2 = 2018+"-"+ 8 +"-"+ 6+ " " +"11:59";
String su2 = "YAY PYTHON AGAIN!!";
new SendToCal(st2, en2, su2);
TimeUnit.SECONDS.sleep(1);
String st = 1999+"-"+ 7 +"-"+ 17+ " " +"12:00";
String en = 1999+"-"+ 7 +"-"+ 17+ " " +"11:59";
String su = "YAY PYTHON!!";
new SendToCal(st, en, su);
}
}
此外,下面是我的 python 脚本:
import sys
def pyscript(arg1,arg2,arg3):
print ("calling python function with parameters:")
print arg1
print arg2
print arg3
pyscript(sys.argv[0],sys.argv[1],sys.argv[2])
我的问题是,当我使用两个或多个完全不同的字符串数组调用 Java 构造函数时,python 的输出是第一个数组输入的副本。感谢任何帮助。
我得到以下输出:
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
我预计:
calling python function with parameters:
2018-8-6 12:00
2018-8-6 11:59
YAY PYTHON AGAIN!!
calling python function with parameters:
1999-7-17 12:00
1999-7-17 11:59
YAY PYTHON AGAIN!!
PythonInterpreter.initialize()
方法只能调用一次。它在你的程序中被调用了两次,第二次,sys.argv
没有更新。
解决此问题的方法是将 pyscript.py 用作模块并调用模块中定义的函数。
将 interp.execfile("pyscript.py");
替换为如下内容:
interp.exec("from pyscript import pyscript");
PyObject func = interp.get("pyscript");
func.__call__(new PyString(start), new PyString(end), new PyString(subject));