如何通过Go的exec.Command实现交互式Python Shell的输入?
解决Go中exec.Command启动交互式Python Shell的输入问题
你的当前代码已经把Python的输出和错误流关联到了终端,但没有处理输入流,所以无法和交互式Shell交互。下面分两种场景给出解决方案:
场景1:让用户在终端直接和Python Shell交互
只需要将命令的Stdin也绑定到os.Stdin,这样终端的输入会直接传递给Python Shell:
package main import ( "fmt" "os" "os/exec" "log" ) func main() { fmt.Println("Before Python shell:") cmd := exec.Command("python.exe") // 绑定标准输入、输出、错误到当前进程的对应流 cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { log.Fatalf("启动Python Shell失败: %v", err) } }
运行这段代码后,你就能在终端直接输入Python代码,和正常启动Python Shell一样交互。
场景2:程序自动向Python Shell输入内容
如果需要程序自动发送输入给Python Shell,可以使用StdinPipe()获取输入管道,然后通过管道写入内容:
package main import ( "fmt" "os/exec" "io" "log" ) func main() { cmd := exec.Command("python.exe") // 获取输入管道 stdin, err := cmd.StdinPipe() if err != nil { log.Fatalf("获取输入管道失败: %v", err) } // 绑定输出和错误流到终端 cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr // 启动命令(非阻塞) if err := cmd.Start(); err != nil { log.Fatalf("启动Python Shell失败: %v", err) } // 向Python Shell写入命令 commands := []string{ "print('Hello from Go!')", "import math", "print(math.sqrt(16))", "exit()", // 退出Shell } for _, cmdStr := range commands { _, err := io.WriteString(stdin, cmdStr+"\n") if err != nil { log.Fatalf("写入命令失败: %v", err) } } // 等待命令执行完成 if err := cmd.Wait(); err != nil { log.Fatalf("Python Shell执行出错: %v", err) } }
这段代码会自动向Python Shell发送一系列命令,你可以在终端看到对应的输出。注意最后要发送exit()来关闭Shell,否则cmd.Wait()会一直阻塞。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

