當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Ruby Open3.popen3用法及代碼示例


本文簡要介紹ruby語言中 Open3.popen3 的用法。

用法

popen3(*cmd, &block)

打開 stdin、stdout 和 stderr 流並啟動外部可執行文件。此外,創建一個等待啟動進程的線程。該線程有一個 pid 方法和一個線程變量:pid,它是已啟動進程的 pid。

方塊形式:

Open3.popen3([env,] cmd... [, opts]) {|stdin, stdout, stderr, wait_thr|
  pid = wait_thr.pid # pid of the started process.
  ...
  exit_status = wait_thr.value # Process::Status object returned.
}

非阻塞形式:

stdin, stdout, stderr, wait_thr = Open3.popen3([env,] cmd... [, opts])
pid = wait_thr[:pid]  # pid of the started process
...
stdin.close  # stdin, stdout and stderr should be closed explicitly in this form.
stdout.close
stderr.close
exit_status = wait_thr.value  # Process::Status object returned.

參數 env、cmd 和 opts 被傳遞給 Process.spawn 。可以接受命令行字符串和參數字符串列表,如下所示:

Open3.popen3("echo abc") {|i, o, e, t| ... }
Open3.popen3("echo", "abc") {|i, o, e, t| ... }
Open3.popen3(["echo", "argv0"], "abc") {|i, o, e, t| ... }

如果最後一個參數 opts 是 Hash ,則將其識別為 Process.spawn 的選項。

Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
  p o.read.chomp #=> "/"
}

wait_thr.value 等待進程終止。塊形式在返回時也等待進程。

關閉 stdin、stdout 和 stderr 不會等待進程完成。

您應該小心避免死鎖。由於管道是固定長度的緩衝區, Open3.popen3 (“prog”) {|i, o, e, t| o.read } 如果程序在 stderr 上生成太多輸出,則會出現死鎖。您應該同時讀取 stdout 和 stderr(使用線程或 IO.select )。但是,如果您不需要 stderr 輸出,則可以使用 Open3.popen2 。如果合並的 stdout 和 stderr 輸出沒有問題,您可以使用 Open3.popen2e 。如果您確實需要將 stdout 和 stderr 輸出作為單獨的字符串,您可以考慮 Open3.capture3

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Open3.popen3。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。