我想使用spawn(用于多个并发子进程)在Ruby中执行外部进程,并将stdout或stderr收集到一个字符串中,其方式与Python的子进程Popen.communicate()相似.
我试图重定向:出/:宁可到一个新的StringIO对象,而是产生一个ArgumentError,暂时重新定义$ stdxxx会混淆了子进程的输出.
万一你不喜欢popen,这是我的方式:
r, w = IO.pipe
pid = Process.spawn(command, :out => w, :err => [:child, :out])
w.close
...
pid, status = Process.wait2
output = r.read
r.close
Run Code Online (Sandbox Code Playgroud)
无论如何,您无法直接重定向到String对象.您最多可以将它定向到IO对象,然后从中读取,就像上面的代码一样.
为什么你需要spawn?除非您使用的是 Windows,否则您可以使用popen*,例如popen4:
require "open4"
pid, p_i, p_o, p_e = Open4.popen4("ls")
p_i.close
o, e = [p_o, p_e].map { |p| begin p.read ensure p.close end }
s = Process::waitpid2(pid).last
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3811 次 |
| 最近记录: |