【发布时间】:2014-12-04 16:00:01
【问题描述】:
我想创建一个虚拟脚本(可能会编写一个真实的脚本),例如从 Scala 进程中调用 Python 交互式解释器,并让用户与子进程完全交互;即子进程的标准输入/标准输出/标准错误应该连接到父(Scala)进程的标准输入/标准输出/标准错误。我尝试使用以下方法无济于事:
#!/usr/bin/env scala -savecompiled
import sys.process._
stringToProcess("python").run(BasicIO.standard(connectInput = true)).exitValue
然而,虽然它似乎确实成功运行了 python 子进程,但我与它的唯一交互是 Ctrl-C:
~$ ./scalashelltest.scala
foo
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyboardInterrupt
如果立即按 Ctrl-C,我什至没有得到该输出:
~$ ./scalashelltest.scala
^C~$
知道为什么会发生这种情况以及如何使其按预期工作吗?
【问题讨论】:
-
你试过在那个空间输入命令吗? (也许以 ctrl-d 或 ctrl-c 结尾?)我希望这是在管道标准输入模式下运行的 python 解释器,因为你没有给它一个 tty。
-
是:以 Ctrl-D 或 Ctrl-C 结束就退出整个过程;除了按下 Ctrl-C 时的 Traceback 之外,Python 不会打印任何内容。
-
进程是否以这种方式运行,它们的输出是否正常?如果那是
echo hello正在运行呢? -
其实你刚刚解决了这个问题:
echo hello按预期工作;在 python 命令中添加-i使一切按预期工作。 -
如果
-i修复了它,那么很可能是我提到的 tty 问题。如果你想运行一个真正的交互式程序,那么你需要给它的不仅仅是标准输入和标准输出,你需要给它一个伪 tty。
标签: shell scala command-line process scala-script