2017-11-29 2 views
0

Ich habe versucht, ein Python-Dienstprogramm aus dem Code zu verwenden, in dem ich schreibe gehen. Ich habe versucht, stdin/stdout zu verwenden, um zwischen den Prozessen zu kommunizieren. Allerdings bekomme ich einen EOF-Fehler mit Pythons raw_input(), auch wenn ich seine stdin auf go's stdin verbinde.EOF Fehler beim Ausführen von Python 2.7-Code von Golang

Hier ist der Code, das Problem zu reproduzieren:

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 

Der Fehler, den ich bekommen ist

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    input = raw_input() 
EOFError 

Ich verstehe nicht, warum das ein wäre Problem. Hat jemand irgendwelche Eingaben?

Antwort

2

Wenn cmd.Start() zurückkehrt, wird der Prozess test.go beendet und seine Standardeingabe geschlossen. Der Prozess, der test.py ausführt, empfängt EOF.

Ändern Sie test.go, fügen Sie etwas wie cmd.Wait(), oder auch nur eine time.Sleep(300 * time.Second) nach dem letzten Block, und Sie werden sehen, was Sie wahrscheinlich erwartet haben.

Zum Beispiel:

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) 
     } 
} 
+0

Ah, ich verstehe. Das macht Sinn. Was also, wenn ich möchte, dass das Python-Skript unbegrenzt läuft? Ist es für mich sinnvoll, einfach eine neue goroutine zu starten, den Python-Prozess dort zu starten und dann cmd.Wait() von dieser Routine zu machen? Vielen Dank! – Seth