首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala2.9中的“scala.sys.process”是如何工作的?

Scala2.9中的“scala.sys.process”是如何工作的?
EN

Stack Overflow用户
提问于 2011-05-16 13:14:07
回答 6查看 20.4K关注 0票数 62

我刚刚看了一下新的scala.sysscala.sys.process包,看看这里是否有什么有用的东西。然而,我完全不知所措。

有没有人有关于如何实际启动进程的示例?

而且,对我来说最有趣的是:你能分离进程吗?

分离的进程将在父进程结束时继续运行,这是Ant的弱点之一。

更新:

分离是什么似乎有些混乱。从我当前的项目中获得一个真实的实例。一次使用z-Shell,一次使用TakeCommand:

Z-Shell:

代码语言:javascript
复制
if ! ztcp localhost 5554; then
    echo "[ZSH] Start emulator"
    emulator                        \
    -avd    Nexus-One               \
    -no-boot-anim                   \
    1>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.out   \
    2>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.err   &
    disown
else
    ztcp -c "${REPLY}"
fi;

Take-Command:

代码语言:javascript
复制
IFF %@Connect[localhost 5554] lt 0 THEN
   ECHO [TCC] Start emulator
   DETACH emulator -avd Nexus-One -no-boot-anim
ENDIFF

在这两种情况下,仿真器都会启动并继续运行,即使在脚本结束之后也是如此。当然,必须编写两次脚本是一种浪费。因此,我现在研究Scala,以便在不使用cygwin或xml语法的情况下进行统一的进程处理。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-16 14:43:39

第一次导入:

代码语言:javascript
复制
import scala.sys.process.Process

然后创建一个ProcessBuilder

代码语言:javascript
复制
val pb = Process("""ipconfig.exe""")

那么你有两个选择:

  1. 运行并阻塞,直到进程退出

val exitCode =pb。!

  • 在后台运行进程(分离)并获取Process实例

val p= pb.run

然后,您可以使用以下命令从进程中获取退出代码(如果进程仍在运行,它将一直阻塞,直到退出)

val exitCode = p.exitValue

如果想要处理流程的输入和输出,可以使用ProcessIO

代码语言:javascript
复制
import scala.sys.process.ProcessIO
val pio = new ProcessIO(_ => (),
                        stdout => scala.io.Source.fromInputStream(stdout)
                          .getLines.foreach(println),
                        _ => ())
pb.run(pio)
票数 77
EN

Stack Overflow用户

发布于 2011-05-16 14:38:22

考虑到您必须显式地等待它退出,并且您需要使用线程来看管stdout和stderr,我确信分离的进程工作得很好。这是非常基本的,但这是我一直在使用的:

代码语言:javascript
复制
/** Run a command, collecting the stdout, stderr and exit status */
def run(in: String): (List[String], List[String], Int) = {
  val qb = Process(in)
  var out = List[String]()
  var err = List[String]()

  val exit = qb ! ProcessLogger((s) => out ::= s, (s) => err ::= s)

  (out.reverse, err.reverse, exit)
}
票数 24
EN

Stack Overflow用户

发布于 2011-05-16 14:49:10

已从SBT导入进程。下面是关于如何使用SBT中出现的流程库的详细指南。

https://github.com/harrah/xsbt/wiki/Process

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6013415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档