You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:10:12