Я думаю, что основная проблема здесь в том, что процесс python работает не так, как вы могли бы ожидать.Вот скрипт bash echo.sh
, который делает то же самое:
#!/bin/bash
while read INPUT
do echo "Hello, $INPUT."
done
Вызов этого скрипта из модифицированной версии вашего кода не имеет той же проблемы с необходимостью закрыть stdin
:
func ReadOutput(output chan string, rc io.ReadCloser) {
r := bufio.NewReader(rc)
for {
x, _ := r.ReadString('\n')
output <- string(x)
}
}
func main() {
cmd := exec.Command("bash", "echo.sh")
stdout, err := cmd.StdoutPipe()
Check(err)
stdin, err := cmd.StdinPipe()
Check(err)
err = cmd.Start()
Check(err)
go func() {
io.WriteString(stdin, "blab\n")
io.WriteString(stdin, "blob\n")
io.WriteString(stdin, "booo\n")
}()
output := make(chan string)
defer close(output)
go ReadOutput(output, stdout)
for o := range output {
Log(o)
}
}
Код Go нуждался в нескольких незначительных изменениях - необходимо изменить метод ReadOutput
, чтобы не блокировать - ioutil.ReadAll
ждал бы EOF
перед возвратом.
Копаниенемного глубже, похоже, что настоящая проблема заключается в поведении raw_input
- он не сбрасывает stdout, как ожидалось.Вы можете передать флаг -u
Python, чтобы получить желаемое поведение:
cmd := exec.Command("python", "-u", "menu.py")
или обновить свой код Python, чтобы использовать sys.stdin.readline()
вместо raw_input()
(см. Этот связанный отчет об ошибке: https://bugs.python.org/issue526382).