Java与命令Propmt交互
使用
String cmdString = "cmd.exe /c start python ";
Process p = Runtime.getRuntime().exec(cmdString);
我可以打开命令提示符并运行python。现在我想与命令提示符交互。我已经读过了
public static void main(String[] args)
{
BufferedWriter writerToProc;
String scriptPath = "C:\\Users\\MichaelMi\\Documents\\SourceTree\\NODE-Sensor-Configurator\\src\\application\\resources\\BACnet-CMD-Line-Upgrader\\UpgradeApplication.py";
String iniPath = "C:\\Users\\MichaelMi\\Documents\\SourceTree\\NODE-Sensor-Configurator\\src\\application\\resources\\BACnet-CMD-Line-Upgrader\\BACpypes.ini";
String execString = "python " + scriptPath + " --ini " + iniPath;
String cmdString = "cmd.exe /c start " + execString ;
try {
Process p = Runtime.getRuntime().exec(cmdString);
writerToProc = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
writerToProc.write(cmdString);
writerToProc.flush();
writerToProc.write("whois\n");
writerToProc.flush();
readErrors(p);
readOutput(p);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readOutput(Process p)
{
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
Runnable task = new Runnable() {
@Override
public void run() {
try {
if(stdInput.ready())
{
stdInput.lines().forEach((l) -> System.out.println(l));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Thread backgroundThread = new Thread(task);
backgroundThread.setDaemon(true);
backgroundThread.start();
}
public static void readErrors(Process p)
{
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
Runnable task = new Runnable() {
@Override
public void run() {
try {
if(stdError.ready())
{
stdError.lines().forEach((l) -> System.out.println(l));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Thread backgroundThread = new Thread(task);
backgroundThread.setDaemon(true);
backgroundThread.start();
}
应该允许我写入open命令提示符。然而,这对我不起作用。我没有收到抛出的异常或状态错误。我根本不知道如何写入打开的命令提示符
# 1 楼答案
在这种情况下,您需要先关闭输入流,然后才能读取
python
进程的输出流。如果有人知道更好的方法,请告诉我们希望这有帮助
# 2 楼答案
我发现您的代码中存在两个问题:
一个问题是使用的命令行:
cmd.exe /c start python
这将启动一个新的cmd。exe实例,它本身使用start
启动分离的python进程。因此,分离的进程未连接到BufferedReader/BufferedWriter第二个问题是python没有通过stdin执行“1+1”。 您只需创建一个具有上下文
1+1\n
的文件test
,并在控制台上执行它即可验证这一点:python < test
。您将看不到任何输出另见piping from stdin to a python code in a bash script