【发布时间】:2018-07-27 17:32:20
【问题描述】:
使用
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();
}
应该允许我写入打开的命令提示符。但是,这对我不起作用。我没有抛出异常或状态错误。我根本不知道如何写入打开的命令提示符。
【问题讨论】:
-
你怎么知道你没有收到错误或异常?您是否正在从 Process 的 InputStream 中读取数据?错误流?并在单独的线程中?请向我们展示您的minimal reproducible example 代码,以便我们可以确切地查看您在做什么,更重要的是,您可能做错了什么。另外,不要使用 Runtime,而是使用更新的 ProcessBuilder。 cmd 字符串也应该是字符串的数组或 ArrayList。
-
我编辑了帖子以显示整个代码。 stdInput 和 stdError 永远不会准备好。我从来没有最终陷入try catch。我打开的命令提示符上没有发布任何内容
-
您可能永远不会知道,因为所有代码都在同一个线程中运行,并带有阻塞代码。请考虑将您的输入和输出分成不同的线程。
-
不启动窗口,启动python:试试
String cmdString = "python"; -
我从未见过 .isReady 在任何代码示例中用于从缓冲区读取。但可以工作。你会想做@HovercraftFullOfEels 所说的;然后,您可以编写一个解析器来解析流并将其传递给处理程序,或者只是将代码写入线程。
BufferedReader br = new BufferedReader(fr); String s = null; while ((s=br.readLine())!=null) { System.out.println(s); }是典型的阅读读者的方法。
标签: java command-prompt