Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python到java的管道输入_Java_Python_Pipe_Stdout - Fatal编程技术网

从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将如何处理这种通信?作为一个列表

我有一个问题,就是使用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将如何处理这种通信?作为一个列表

我用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解析字符串
  • 将列表拆分为单独的行,并将每个行写入Java子进程,然后将它们重新组合到一个列表中
  • 使用JSON。将列表的JSON字符串发送到Java,并使用许多可用的JSON库之一对其进行解码
  • 我会选择第三个选项,JSON,因为它为可以通信的数据结构类型提供了更大的灵活性。e、 g.以后您可能会发现自己想要转移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。它可以处理基本列表和字典。这将使用包进行解析:

    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解析字符串
  • 将列表拆分为单独的行,并将每个行写入Java子进程,然后将它们重新组合到一个列表中
  • 使用JSON。将列表的JSON字符串发送到Java,并使用许多可用的JSON库之一对其进行解码
  • 我会选择第三个选项,JSON,因为它为可以通信的数据结构类型提供了更大的灵活性。e、 g.以后您可能会发现自己想要转移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。它可以处理基本列表和字典。这将使用包进行解析:

    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”。请随意使用任何适合您的案例。我会更新答案。