【问题标题】:Execute subcommand in Scala (script) and let it "take over"在 Scala(脚本)中执行子命令并让它“接管”
【发布时间】: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


【解决方案1】:

你没有给 python 一个(伪)tty。你只是给它标准输入(可能还有标准输出)。

所以python是在非交互模式下运行的。

使用-i 标志运行 python 将强制它使用提示,即使没有 tty,但更正确的修复可能是找到一个可以创建(伪)tty 并在其中运行应用程序的 scala/java 库.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2016-01-30
    • 2016-07-25
    • 2013-09-22
    • 2014-11-17
    相关资源
    最近更新 更多