如何用Java向iPython提示符逐行输入命令?技术问询
如何在Java中向iPython逐行输入命令
嘿,我来帮你解决这个问题!你当前的代码把两条print命令拼在了一起,iPython会把它们当作单条语句执行,但如果要模拟手动逐行输入的效果,核心是要让每条命令都以换行符结尾,并且每次写入后立即刷新输出流,让iPython能及时接收并执行。
核心修改要点
- 每条命令末尾添加
\n(模拟手动按回车的操作) - 拆分命令为单独的字符串,逐行写入并刷新输出流
- 建议添加输出读取逻辑,避免缓冲区阻塞导致进程挂起
修改后的完整代码示例
public static Process pr; public static BufferedReader bfr; public static BufferedWriter bfw; public static void main(String[] args) throws IOException { Runtime rt = Runtime.getRuntime(); pr = rt.exec("ipython"); bfr = new BufferedReader(new InputStreamReader(pr.getInputStream())); bfw = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream())); // 逐行定义命令,每条末尾加换行符 String firstCmd = "print('test 1')\n"; String secondCmd = "print('test 2')\n"; // 写入第一条命令并立即刷新 bfw.write(firstCmd); bfw.flush(); // 读取iPython的输出,避免缓冲区阻塞 readIPythonOutput(); // 写入第二条命令并刷新 bfw.write(secondCmd); bfw.flush(); readIPythonOutput(); // 最后发送退出命令关闭iPython进程 bfw.write("exit()\n"); bfw.flush(); } // 辅助方法:读取并打印iPython的输出,直到遇到新的提示符 private static void readIPythonOutput() throws IOException { String outputLine; while ((outputLine = bfr.readLine()) != null) { System.out.println("iPython >> " + outputLine); // 当读取到iPython的输入提示符(比如In [2]:),停止读取,准备下一条命令 if (outputLine.startsWith("In [")) { break; } } }
为什么这样能解决问题?
iPython的交互模式是行驱动的——只有当你输入换行符(按下回车)时,它才会执行当前行的命令。你之前的代码把两条命令连在一起,iPython会把它们解析成一条连续的代码执行;而逐行添加\n并刷新,就完全模拟了手动在iShell里输入命令的流程。
另外,添加readIPythonOutput方法很重要:如果iPython的输出缓冲区被占满,进程可能会挂起无法继续接收新命令,及时读取输出能避免这个问题。
内容的提问来源于stack exchange,提问作者rdv
相关产品推荐
相关产品推荐

