我正在尝试使用java运行Python脚本,如下所示:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
public class JsonToString {
public static void main(String[] args) throws Exception {
Map<String, String> map = new HashMap<>();
map.put("Query", "test projects");
Gson gson = new Gson();
String json = gson.toJson(map);
System.out.println("json:" + json);
String scriptCmd = "python /Scripts/search_php.py \"" + json+"\"";
System.out.println("scriptCmd:" + scriptCmd);
Process p = Runtime.getRuntime().exec(scriptCmd);
System.out.println("process:" + p);
p.waitFor();
System.out.println("process wait completed");
String line;
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
System.out.println("*******ERROR*******");
while ((line = error.readLine()) != null) {
System.out.println(line);
}
error.close();
System.out.println("*******INPUT*******");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
System.out.println("*******OUTPUT*******");
OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
}
}
Python脚本的值如下:
argv data :"{"Query":"test
它忽略了空间之后的价值。基本上我必须将json字符串作为参数传递给python脚本。
{"Query":"test projects"}
要传递带空格的字符串(json字符串)作为参数,我用双引号括起来和/也要用它来转义它。但我无法传递确切的字符串。怎么做 ?
如果使用ProcessBuilder
类,则可以使用参数列表启动进程,而不仅仅是参数字符串。如果使用此类,则可以将整个JSON字符串放入单个参数中,并直接在Python端访问它。
但是,命令行参数的大小可能有些限制。 (限制因操作系统而异,也取决于系统配置。)将JSON数据写入Python进程的标准输入可能更可靠。 ProcessBuilder
类也为此提供了一种机制。