从python到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

姆霍克

这里有一些选择:

  1. 使用str()repr()将列表转换为字符串表示形式。然后解析Java中的字符串。
  2. 将列表分成几行,然后将各行写入Java子进程,这会将它们放回到一个列表中。
  3. 使用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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

管道输入到PWDX

来自分类Dev

如何从Linux程序逐行将输入管道到python?

来自分类Dev

通过管道输入到纳米

来自分类Dev

Bash管道到Python

来自分类Dev

使用管道将输入传递到passwd

来自分类Dev

R:管道输入到功能工厂

来自分类Dev

将输入从文件重定向到 Python 脚本失败,但可以使用管道

来自分类Dev

Java 程序不接受管道输入

来自分类Dev

python脚本到python的管道名称

来自分类Dev

找出Python中是否有管道输入?

来自分类Dev

管道/混合线路输入到PulseAudio中的输出

来自分类Dev

如何将管道输入定向到ls命令?

来自分类Dev

管道/混合线路输入到PulseAudio中的输出

来自分类Dev

管道和标准输入重定向到猫

来自分类Dev

Systemd:管道输入到守护服务器?

来自分类Dev

如何将管道输入定向到ls命令?

来自分类Dev

“管道未连接”到Java Callable儿子

来自分类Dev

Bash脚本在管道输入到while循环之前对输入文件进行排序

来自分类Dev

将输入管道传输到Bash中的Java程序

来自分类Dev

将输入管道输入脚本

来自分类Dev

Python管道到`gzip.open`文件句柄

来自分类Dev

从tkinter到python脚本输入,从python脚本到tkinter输出

来自分类Dev

输入到ArrayList Java的int列表

来自分类Dev

将用户输入存储到数组Java

来自分类Dev

Byte []输入到Java扫描器

来自分类Dev

从用户输入到重复过程的 Java 循环?

来自分类Dev

将输入\输出管道从父进程重定向到cmd子进程C / C ++ WinApi

来自分类Dev

在每个命令之后,将通过管道传递到“更少”的PHP输出要求输入<enter>

来自分类Dev

管道输入到外档