[英]How to pass data from java to python script as parameter
I wanted to run a script from java class.我想从 java 类运行脚本。 I was able to do it with ProcessBuilder
.我能够用ProcessBuilder
做到这一点。 Now I am struggling to pass data as an argument to the script.现在我正在努力将数据作为参数传递给脚本。 I can pass a string, but I am having trouble passing list of data (data read from a CSV file).我可以传递一个字符串,但我无法传递数据列表(从 CSV 文件读取的数据)。 One that I tried was using StringBuffer
and passing the data as Bytes
我尝试过的一种方法是使用StringBuffer
并将数据作为Bytes
传递
StringBuffer sb = new StringBuffer();
ArrayList argsList = new ArrayList();
// append the sb from record.
//convert it to bytes
//sb.toString() contains my data with a delimiter ';'
// sb.toString().getBytes("UTF-8").toString()
argsList.add(0,"Continuum/anaconda3/envs/sth/python");
argsList.add(1,"python/test.py");
argsList.add(2,"python/test.py");
argsList.add(3,sb.toString().getBytes("UTF-8").toString())
ProcessBuilder builder = new ProcessBuilder(argsList);
Process p = builder.start();
I can not pass sb.toString().getBytes("UTF-8")
to the process builder.我无法将sb.toString().getBytes("UTF-8")
传递给流程构建器。 I get java.lang.ArrayStoreException
我得到java.lang.ArrayStoreException
On the other hand, if I pass sb.toString()
, I get另一方面,如果我通过sb.toString()
,我得到
java.io.IOException: Cannot run program Continuum/anaconda3/envs/sth/python, CreateProcess error=206, The filename or extension is too long
add it to list of commands to process builder.
How can I read what I passed in python?我如何阅读我在 python 中传递的内容?
Is this even the right way to pass data ( row X column)?这甚至是传递数据(行 X 列)的正确方法吗?
Thanks谢谢
You can try below code :: 您可以尝试以下代码::
import java.io.*;
class RunPythonCommand {
public static void main(String [] args) {
try {
String prg = "import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
BufferedWriter out = new BufferedWriter(new FileWriter("sample_code.py"));
out.write(prg);
out.close();
int param1 = 10;
int param2 = 32;
ProcessBuilder pb = new ProcessBuilder("python", "sample_code.py", "" + param2, "" + param1);
Process p = pb.start();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
int ret = new Integer(in.readLine()).intValue();
System.out.println("value is : " + ret);
} catch (Exception e) {
System.out.println(e);
}
}
}
Hope it will help you 希望它会对你有所帮助
You can pass args as array.:您可以将 args 作为数组传递。:
final String PYTHON = "python";最终字符串 PYTHON = "python";
final String SCRIPT_PATH = new File("Pyscript.py").getPath(); final String SCRIPT_PATH = new File("Pyscript.py").getPath();
final String ACTION = "-aexport"; final String ACTION = "-aexport";
final String[] CMD_ARRAY = {PYTHON, SCRIPT_PATH, ACTION};最终字符串[] CMD_ARRAY = {PYTHON, SCRIPT_PATH, ACTION};
ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY); ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.