Wenn du Python als Unterprozeß anrufst, kann ich es zwingen, im interaktiven Modus zu laufen?

Ich bin auf einem Mac mit Scala, und ich möchte einen Python-Interpreter als Unterprozeß erstellen, mit dem mein Programm interagiert. Ich verwende Prozess mit einem ProcessIO, aber Python besteht darauf, im nicht interaktiven Modus zu laufen. So tut es nur etwas, nachdem ich seinen Eingang heruntergekommen und den Prozess getötet habe. Gibt es eine Möglichkeit, es zu zwingen, im interaktiven Modus zu laufen, damit ich den Python-Prozess lebendig halten kann und damit interagiere? Dieser Beispielcode (den ich in eine Scala repl einklebe) zeigt das Problem:

import scala.sys.process._ import scala.io._ import java.io._ import scala.concurrent._ val inputStream = new SyncVar[OutputStream]; val process = Process("python").run(pio) val pio = new ProcessIO( (stdin: OutputStream) => { inputStream.put(stdin) }, (stdout: InputStream) => { while (true) { if (stdout.available > 0){ Source.fromInputStream(stdout).getLines.foreach(println) } } }, stderr => Source.fromInputStream(stderr).getLines.foreach(println), daemonizeThreads=true ) def write(s: String): Unit = { inputStream.get.write((s + "\n").getBytes) inputStream.get.flush() } def close(): Unit = { inputStream.get.close } write("import sys") write("try: print 'ps1:', sys.ps1") write("except: print 'no ps1'") close // it's only here that output prints to the screen 

2 Solutions collect form web for “Wenn du Python als Unterprozeß anrufst, kann ich es zwingen, im interaktiven Modus zu laufen?”

Rufen Sie Python mit der -i Flagge auf.

Wenn kein Skript angegeben ist, führt dies dazu, dass Python im interaktiven Modus ausgeführt wird, ob Stdin ein Terminal zu sein scheint oder nicht. Wenn ein Skript angegeben wird, veranlasst dies Python, nach dem Ausführen des Skripts den interaktiven Modus einzugeben.

UPDATE: diese Antwort ist völlig falsch, siehe Diskussion in den Kommentaren


python läuft bereits im interaktiven mode.

-i Flags ist nützlich, wenn Sie zuerst ein Skript ausführen müssen, zB python -i some_script.py (oder -c Befehl). Es gilt nicht in Ihrem Fall.

// Es ist nur hier, dass die Ausgabe auf den Bildschirm druckt

Ihr Problem ist der Blockpufferungsmodus, wenn die Ausgabe kein Tty ist . Pass -u Kommandozeilen-Flag zu python , um seine Standard-Streams zu entlasten . Oder ruf sys.stdout.flush() nach dem print .

  • Mit Python, um eine Shell-Umgebung zu öffnen, führen Sie eine Befehls- und Exit-Umgebung aus
  • Erstellen und pipieren Sie ein Datei-ähnliches Objekt als Eingabe für einen Befehl
  • Verwenden von Sudo mit Python-Skript
  • Running Shell-Befehl aus Python und Erfassung der Ausgabe
  • Wie bekomme ich Ausnahme von Python subprocess.check_output ()?
  • Wie kann ich die Standard-Eingabe eines Subprozesses von einem Python-Iterator ausführen?
  • Ausgabedatei aus dem Python-Unterprozess mit 'start'
  • Python-Unterprozeß readlines () hängt
  • Aufruf von pdftotext aus Python-Skript nicht funktioniert, wenn ich von lokalen Maschine zu meinem Webhosting wechseln
  • Python-Laich aus einem untergeordneten Unterprozeß, löst und beendet
  • Python, subprocess: startet neuen Prozess, wenn einer (in einer Gruppe) beendet hat
  • Python ist die beste Programmiersprache der Welt.