(我是Java新手)我需要启动一个进程并接收2或3个句柄:对于STDIN,STDOUT(和STDERR),因此我可以将输入写入进程并接收其输出,就像命令行管道一样表现(例如“
grep”)
在Python中,可以通过以下代码实现:
from subprocess import Popen, PIPE
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
child_stdin.write('Yoram Opposum\n')
child_stdin.flush()
child_stdout.readlines()
Java等效项是什么?
到目前为止我已经尝试过
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader inp = new BufferedReader( new InputStreamReader(p.getInputStream()) );
BufferedWriter out = new BufferedWriter( new OutputStreamWriter(p.getOutputStream()) );
out.write( "Some Text!\n\n" );
out.flush();
line = inp.readLine();
print("response1: " + line ); // that's ok
out.write( "Second Line...\n" );
out.flush();
line = inp.readLine();
print("response2: " + line ); // returns an empty string, if it returns,,,
inp.close();
out.close();
顺便说一句,第一次尝试仅适用于\ n \ n,但不适用于单个\ n(为什么?)
下面的代码有效,但是所有输入都是预先给出的,而不是我要查找的行为:
out.write( "Aaaaa\nBbbbbb\nCcccc\n" );
out.flush();
line = inp.readLine();
print("response1: " + line );
line = inp.readLine();
print("response2: " + line );
line = inp.readLine();
print("response3: " + line );
line = inp.readLine();
print("response4: " + line );
输出:
response1: AAAAA
response2:
response3: bbbbbb
response4:
正在运行的过程如下所示:
s = sys.stdin.readline()
print s.upper()
s = sys.stdin.readline()
print s.lower()
好的,这也是我的python代码错误,但是与@Jon的回答相反,有一个EXTRA换行符(确切地说是0xA0,这不是Windows的标准)。
一旦我从Java获得的行中剥离()了额外的0xA0,python就会在返回的途中向Java添加一个“正常” \ n,并且运行顺利。
为了完整地回答问题,下面是一个有效的Java代码:
import java.io.*;
import java.util.*;
public class Main {
public static BufferedReader inp;
public static BufferedWriter out;
public static void print(String s) {
System.out.println(s);
}
public static String pipe(String msg) {
String ret;
try {
out.write( msg + "\n" );
out.flush();
ret = inp.readLine();
return ret;
}
catch (Exception err) {
}
return "";
}
public static void main(String[] args) {
String s;
String cmd = "c:\\programs\\python\\python.exe d:\\a.py";
try {
print(cmd);
print(System.getProperty("user.dir"));
Process p = Runtime.getRuntime().exec(cmd);
inp = new BufferedReader( new InputStreamReader(p.getInputStream()) );
out = new BufferedWriter( new OutputStreamWriter(p.getOutputStream()) );
print( pipe("AAAaaa") );
print( pipe("RoteM") );
pipe("quit")
inp.close();
out.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
这是python代码
import sys
s = sys.stdin.readline().strip()
while s not in ['break', 'quit']:
sys.stdout.write(s.upper() + '\n')
sys.stdout.flush()
s = sys.stdin.readline().strip()
我试图与一个进程通信(该进程本身会写入stdin和stdout,以便在终端中与用户交互),并在C中读取它的stdin和写入它的stdout。 因此,我尝试以编程方式替换shell用户。一个methapohrical示例:假设出于某种原因我想在C中使用VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)中读取内容。 起初我认为这可能是一项微不足道的任务,但似乎没有标准的方法<代码>i
问题内容: 我正在为Java编程竞赛编写一些代码。程序的输入是使用stdin给出的,输出是在stdout上给出的。你们如何测试可在stdin / stdout上运行的程序?这就是我的想法: 由于System.in的类型为InputStream,而System.out的类型为PrintStream,因此我使用以下原型在函数中编写了代码: 现在,我想使用junit对此进行测试。我想使用字符串伪造Sys
问题内容: 我正在尝试编写一个Python脚本来启动一个子进程,并将其写入子进程stdin。我还希望能够确定子进程崩溃时要采取的措施。 我试图启动的过程是一个名为的程序nuke,它具有自己的Python内置版本,我希望能够向其提交命令,然后告诉其在命令执行后退出。到目前为止,我已经得出结论,如果我在类似这样的命令提示符下启动Python,然后作为子进程启动,那么我可以在中键入命令,但是我希望能够将
问题内容: 这是此问题的后续措施,但是如果我想将参数传递给,如何实时获取输出?这就是我目前拥有的;我也尝试从模块中替换为,这只会导致脚本挂起。 在我不必通过的前一个问题中,建议我使用,没有空间输送任何东西到。 附录:这适用于传输,但是我只能在最后看到输出,并且我想查看传输发生时的详细信息。 问题答案: 为了实时从子流程中获取标准输出,您需要准确确定所需的行为;具体来说,您需要确定是要逐行处理还是逐
问题内容: 我试图在Python中使用子进程,以使外部脚本以类似于服务器的方式打开。外部脚本首先加载模型。完成此操作后,它将通过STDIN接受请求,并将处理后的字符串返回给STDOUT。 到目前为止,我已经尝试过 但是,我不能使用 为了通过子过程重复处理input_strings,无论我使用还是,out都将是空的。但是,当我在读取STDOUT之前关闭stdin时,它起作用了,但是这关闭了子进程,这
问题内容: 如果我通过Java的ProcessBuilder类启动流程,则可以完全访问该流程的标准输入,标准输出和标准错误流(如Java 和)。不过,我不能找到一种方法,这些流无缝连接,和。 可以用来获取包含子流程的标准输出和标准错误的单个文件,然后循环遍历并通过我的标准输出将其发送出去,但是我找不到一种方法可以让用户输入到流程中,如果我使用C 调用,他或她可以。 Java SE 7发行时似乎有可