尝试从Golang执行python 2.7代码时出现EOF错误

尝试从Golang执行python 2.7代码时出现EOF错误,go,Go,我一直在尝试使用我在go中编写的代码中的python实用程序。我一直在尝试使用stdin/stdout在进程之间进行通信。但是,使用python的raw\u input(),即使我将其stdin连接到go的stdin,也会出现EOF错误 以下是重现问题的代码: test.go: package main import ( "os" "os/exec" ) func main() { cmd := exec.Command("python", "test.py")

我一直在尝试使用我在go中编写的代码中的python实用程序。我一直在尝试使用stdin/stdout在进程之间进行通信。但是,使用python的
raw\u input()
,即使我将其stdin连接到go的stdin,也会出现EOF错误

以下是重现问题的代码:

test.go:

package main

import (
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("python", "test.py")

    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    // Start the process
    if err := cmd.Start(); err != nil {
        panic(err)
    }
}
test.py:

while True:
    input = raw_input()
    print input
我得到的错误是

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    input = raw_input()
EOFError
回溯(最近一次呼叫最后一次):
文件“test.py”,第3行,在
输入=原始输入()
伊奥费罗
我不明白为什么这会成为一个问题。有人有任何输入吗?

cmd.Start()
返回时,运行test.go的进程退出,其标准输入关闭;因此,运行test.py的进程接收EOF

修改test.go,添加类似于
cmd.Wait()
,甚至在最后一个块后添加
time.Sleep(300*time.Second)
,您将看到您可能期望的结果

例如:

package main

import (
        "fmt"
        "os"
        "os/exec"
) 

func main() {
        cmd := exec.Command("python", "test.py")

        cmd.Stderr = os.Stderr
        cmd.Stdout = os.Stdout
        cmd.Stdin = os.Stdin

        // Start the process
        if err := cmd.Start(); err != nil {
                panic(err)
        }
        if err := cmd.Wait(); err != nil { 
                fmt.Println("cmd.Wait() in parent process:", err)
        }
}
cmd.Start()
返回时,运行test.go的进程退出,其标准输入关闭;因此,运行test.py的进程接收EOF

修改test.go,添加类似于
cmd.Wait()
,甚至在最后一个块后添加
time.Sleep(300*time.Second)
,您将看到您可能期望的结果

例如:

package main

import (
        "fmt"
        "os"
        "os/exec"
) 

func main() {
        cmd := exec.Command("python", "test.py")

        cmd.Stderr = os.Stderr
        cmd.Stdout = os.Stdout
        cmd.Stdin = os.Stdin

        // Start the process
        if err := cmd.Start(); err != nil {
                panic(err)
        }
        if err := cmd.Wait(); err != nil { 
                fmt.Println("cmd.Wait() in parent process:", err)
        }
}

啊,我明白了。这是有道理的。那么,如果我想让python脚本无限期地运行呢?对我来说,启动一个新的goroutine,在那里启动python进程,然后从该例程执行cmd.Wait()有意义吗?谢谢啊,我明白了。这是有道理的。那么,如果我想让python脚本无限期地运行呢?对我来说,启动一个新的goroutine,在那里启动python进程,然后从该例程执行cmd.Wait()有意义吗?谢谢