从 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中。

这里有几个选项:

  1. 使用str()repr() 将列表转换为字符串表示形式。然后解析 Java.
  2. 中的字符串
  3. 将列表拆分为单独的行,并将每一行写入 Java 子进程,子进程将它们重新组合成一个列表。
  4. 使用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);
    }
}