从 python 到 java 的管道输入
piping input from python to java
我有一个使用通信
从 python 到 java 的管道问题
import subprocess
str = ["haha", "hehe"]
p = subprocess.Popen("java -jar "hi.jar", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
#p.communicate(str)
我想运行将一个列表传递给我的子进程并获得列表的输出
我的问题是 java 将如何处理这种沟通?作为列表?
我在 java 中使用它来处理它。
Scanner in = new Scanner(System.in)
//Not sure what to put here if i am using
in.nextline()
我正在尝试将列表传输到 java 引擎进行处理,并将输出作为列表从 java 传输回 python
因为您无法使用子进程通信函数来传送列表,我会分别传送每个列表成员,然后创建一个数组(或 java.util.List 因为 java 没有原始列表)使用用于将每个成员添加到数组的 for 循环。
您将不得不使用新的一行来分隔您的字符串。
import subprocess
l = "line 1\nline 2\nline 3"
p = subprocess.Popen(["java", "-jar", "hi.jar"], stdin = subprocess.PIPE)
p.communicate(l)
您的 java 代码可能如下所示。
import java.util.Scanner;
public class ReadData
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
System.out.println(sc.nextLine() + " - line");
}
}
}
创建简单的清单文件。
echo "Main-Class: ReadData" > manifest.txt
使用javac ReadLine.java
编译java代码并使用jar cvfm hi.jar manifest.txt *.class
命令将代码打包到jar中。
这里有几个选项:
- 使用
str()
或repr()
将列表转换为字符串表示形式。然后解析 Java. 中的字符串
- 将列表拆分为单独的行,并将每一行写入 Java 子进程,子进程将它们重新组合成一个列表。
- 使用JSON。将列表的 JSON 字符串发送到 Java 并使用众多可用的 JSON 库之一对其进行解码。
我会选择第三个选项,JSON,因为这为可以通信的数据结构类型提供了更大的灵活性。例如您稍后可能会发现自己想要传输 Python 词典。稍后您可能还会发现您希望 Java 应用程序发送回复,并且 JSON 也可以在这里使用。
Python 将列表作为 JSON 字符串发送:
import json
import subprocess
# send a Python list...
p = subprocess.Popen("java -jar "hi.jar", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
o, e = p.communicate(json.dumps(["haha", "hehe"]))
>>> print o
handleInput(): got a JSONArray (list) containing 2 elements
haha
hehe
# send a Python dictionary...
p = subprocess.Popen("java -jar "hi.jar", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
o, e = p.communicate(json.dumps({"hee": "haw", "blah": "blah"}))
>>> print o
handleInput(): got a JSONObject (map) containing 2 items
hee: haw
blah: blah
并示例 Java 代码来接收和解析 JSON。它可以处理基本的列表和字典。这使用 json-simple
包进行解析:
import java.util.Scanner;
import java.util.Iterator;
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
class JSONMessageHandler {
void handleInput(JSONArray list)
{
System.out.println(
"handleInput(): got a JSONArray (list) containing " +
list.size() + " elements");
for (Object o : list)
System.out.println(o);
}
void handleInput(JSONObject map)
{
System.out.println(
"handleInput(): got a JSONObject (map) containing " +
map.size() + " items");
for (Iterator it = map.keySet().iterator(); it.hasNext();)
{
Object key = it.next();
System.out.println(key + ": " + map.get(key));
}
}
}
class Hi {
public static void main(String[] args) throws ParseException {
Scanner in = new Scanner(System.in);
Object obj = new JSONParser().parse(in.nextLine());
JSONMessageHandler msgHandler = new JSONMessageHandler();
if (obj instanceof JSONArray)
msgHandler.handleInput((JSONArray)obj);
else if (obj instanceof JSONObject)
msgHandler.handleInput((JSONObject)obj);
}
}
我有一个使用通信
从 python 到 java 的管道问题import subprocess
str = ["haha", "hehe"]
p = subprocess.Popen("java -jar "hi.jar", stdin = subprocess.PIPE, stdout = subprocess.PIPE)
#p.communicate(str)
我想运行将一个列表传递给我的子进程并获得列表的输出
我的问题是 java 将如何处理这种沟通?作为列表?
我在 java 中使用它来处理它。
Scanner in = new Scanner(System.in)
//Not sure what to put here if i am using
in.nextline()
我正在尝试将列表传输到 java 引擎进行处理,并将输出作为列表从 java 传输回 python
因为您无法使用子进程通信函数来传送列表,我会分别传送每个列表成员,然后创建一个数组(或 java.util.List 因为 java 没有原始列表)使用用于将每个成员添加到数组的 for 循环。
您将不得不使用新的一行来分隔您的字符串。
import subprocess
l = "line 1\nline 2\nline 3"
p = subprocess.Popen(["java", "-jar", "hi.jar"], stdin = subprocess.PIPE)
p.communicate(l)
您的 java 代码可能如下所示。
import java.util.Scanner;
public class ReadData
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
System.out.println(sc.nextLine() + " - line");
}
}
}
创建简单的清单文件。
echo "Main-Class: ReadData" > manifest.txt
使用javac ReadLine.java
编译java代码并使用jar cvfm hi.jar manifest.txt *.class
命令将代码打包到jar中。
这里有几个选项:
- 使用
str()
或repr()
将列表转换为字符串表示形式。然后解析 Java. 中的字符串
- 将列表拆分为单独的行,并将每一行写入 Java 子进程,子进程将它们重新组合成一个列表。
- 使用JSON。将列表的 JSON 字符串发送到 Java 并使用众多可用的 JSON 库之一对其进行解码。
我会选择第三个选项,JSON,因为这为可以通信的数据结构类型提供了更大的灵活性。例如您稍后可能会发现自己想要传输 Python 词典。稍后您可能还会发现您希望 Java 应用程序发送回复,并且 JSON 也可以在这里使用。
Python 将列表作为 JSON 字符串发送:
import json
import subprocess
# send a Python list...
p = subprocess.Popen("java -jar "hi.jar", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
o, e = p.communicate(json.dumps(["haha", "hehe"]))
>>> print o
handleInput(): got a JSONArray (list) containing 2 elements
haha
hehe
# send a Python dictionary...
p = subprocess.Popen("java -jar "hi.jar", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
o, e = p.communicate(json.dumps({"hee": "haw", "blah": "blah"}))
>>> print o
handleInput(): got a JSONObject (map) containing 2 items
hee: haw
blah: blah
并示例 Java 代码来接收和解析 JSON。它可以处理基本的列表和字典。这使用 json-simple
包进行解析:
import java.util.Scanner;
import java.util.Iterator;
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
class JSONMessageHandler {
void handleInput(JSONArray list)
{
System.out.println(
"handleInput(): got a JSONArray (list) containing " +
list.size() + " elements");
for (Object o : list)
System.out.println(o);
}
void handleInput(JSONObject map)
{
System.out.println(
"handleInput(): got a JSONObject (map) containing " +
map.size() + " items");
for (Iterator it = map.keySet().iterator(); it.hasNext();)
{
Object key = it.next();
System.out.println(key + ": " + map.get(key));
}
}
}
class Hi {
public static void main(String[] args) throws ParseException {
Scanner in = new Scanner(System.in);
Object obj = new JSONParser().parse(in.nextLine());
JSONMessageHandler msgHandler = new JSONMessageHandler();
if (obj instanceof JSONArray)
msgHandler.handleInput((JSONArray)obj);
else if (obj instanceof JSONObject)
msgHandler.handleInput((JSONObject)obj);
}
}