从python到java的管道输入
我有一个问题,就是使用communicate从python到java的管道从python到java的管道输入,java,python,pipe,stdout,Java,Python,Pipe,Stdout,我有一个问题,就是使用communicate从python到java的管道 import subprocess str = ["haha", "hehe"] p = subprocess.Popen("java -jar "hi.jar", stdin = subprocess.PIPE, stdout = subprocess.PIPE) #p.communicate(str) 我希望运行一个列表与我的子进程通信,并以列表的形式获取输出 我的问题是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循环将每个成员添加到数组中。由于无法使用subprocess communicate函数传递列表,我将分别传递每个列表成员,然后创建一个数组(或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中。您必须使用新行来分隔字符串
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解析字符串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。它可以处理基本列表和字典。这将使用包进行解析:
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);
}
}
这里有几个选项:
str()
或repr()
将列表转换为字符串表示形式。然后用Java解析字符串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。它可以处理基本列表和字典。这将使用包进行解析:
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);
}
}
也许使用cmd/bash/etc.命令作为粘合层会更容易?@TigerhawkT3我最好的办法是在java中写入文件并从文件中读取。但是它会极大地影响性能,因此不是一个可行的解决方案?我认为subprocess.Popen communicate函数不会将列表作为参数。@Boris不,我不能。我想说的是我想传达一份清单。你们应该能够用新的界限来划分。我会发布一个答案。也许使用cmd/bash/etc.命令作为粘合层会更容易?@TigerhawkT3我最好的办法是用java写一个文件并从文件中读取。但是它会极大地影响性能,因此不是一个可行的解决方案?我认为subprocess.Popen communicate函数不会将列表作为参数。@Boris不,我不能。我想说的是我想传达一份清单。你们应该能够用新的界限来划分。我会发布一个答案。sc.hasNextLine()会更好吗?我使用的是sc.nextline()而不是sc.next()。它们之间的区别是,下一行将在空格处停止,下一行将一直运行,直到找到“\n”。请随意使用任何适合您的案例。我会更新答案。sc.hasNextLine()会更好吗?我使用的是sc.nextline()而不是sc.next()。它们之间的区别是,下一行将在空格处停止,下一行将一直运行,直到找到“\n”。请随意使用任何适合您的案例。我会更新答案。