gpt4 book ai didi

java - Java 中的 Runtime.exec() 挂起,因为它正在等待来自 System.in 的输入

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:50 25 4
gpt4 key购买 nike

我有以下简短的 python 程序“test.py”

n = int(raw_input())
print n

我正在从以下 java 程序“ProcessRunner.java”中执行上述程序

import java.util.*;
import java.io.*;

public class ProcessRunner {
public static void main(String[] args) {
try {
Scanner s = new Scanner(Runtime.getRuntime().exec("python test.py").getInputStream()).useDelimiter("\\A");
System.out.println(s.next());
}

catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

运行命令后,

java ProcessRunner

我无法将正确格式的值“n”传递给 Python 程序,而且 java 运行挂起。处理这种情况并从 Java 程序内部将值动态传递给 Python 程序的正确方法是什么?

最佳答案

raw_input() , 或 input()在 Python 3 中,将阻止等待标准输入上的新行终止输入,但是,Java 程序不会向它发送任何内容。

尝试使用 getOutputStream() 返回的流写入 Python 子进程。这是一个例子:

import java.util.*;
import java.io.*;

public class ProcessRunner {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("python test.py");
Scanner s = new Scanner(p.getInputStream());
PrintWriter toChild = new PrintWriter(p.getOutputStream());

toChild.println("1234"); // write to child's stdin
toChild.close(); // or you can use toChild.flush()
System.out.println(s.next());
}

catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

另一种方法是将 n 作为命令行参数传递。这需要修改 Python 脚本以预期和处理命令行参数,并修改 Java 代码以发送参数:

import java.util.*;
import java.io.*;

public class ProcessRunner {
public static void main(String[] args) {
try {
int n = 1234;
Process p = Runtime.getRuntime().exec("python test.py " + n);
Scanner s = new Scanner(p.getInputStream());
System.out.println(s.next());
}

catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

和 Python 脚本,test.py:

import sys

if len(sys.argv) > 1:
print int(sys.argv[1])

关于java - Java 中的 Runtime.exec() 挂起,因为它正在等待来自 System.in 的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39612862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com