2013-05-21 44 views
1

Python的调用可能会失败,subprocess.check_callsubprocess.check_output子进程提供了两个方便的功能。基本上,红宝石相当于Python的subprocess.check_call的/ check_output

subprocess.check_call(['command', 'arg1', ...]) 

产卵指定的命令作为子进程,块,和验证子过程成功结束(返回零)。如果不是,则会引发异常。 check_output做同样的事情,除了它捕获子进程的标准输出并将其作为字节字符串返回。

这很方便,因为它是一个单独的Python表达式(您不必在几行代码中设置和控制子进程),并且没有遗漏检查返回值的风险。

什么是check_callcheck_output的惯用Ruby等价物?我知道$? global可以给出进程的返回值,但那会很尴尬 - 有例外的一点是您不必手动检查错误代码。 There are numerous ways to spawn a subprocess in Ruby,但我没有看到任何提供此功能的内容。

回答

0

基本/内置方法由POpen4宝石取代。而宝石提供了更多的迷人之处。

1

很难说Ruby中最常用的解决方案是什么......但最接近Python的解决方案大概是 shell-executer

从文档页面上的例子:

begin 
    Shell.execute!('ls /not_existing') 
rescue RuntimeError => e 
    print e.message 
end 

对比:

try: 
    subprocess.check_call('ls /not_existing', shell=True) 
except Exception as e: 
    print e.message 

这里最显着的区别是,红宝石相当于没有办法做到shell=False(和以args作为列表),Python不仅具有,而且默认为。

此外,Python的e.message将根据返回码生成一个默认的消息什么的,而Ruby的e.message将孩子的stderr

如果你想要做shell=False,据我所知,你得写东西左右水平较低自己的包装;所有的红宝石包装我知道的(shell-executerPopen4,[open4] [4])是围绕包装或的POSIX popen功能仿真器。

1

这里有一个简单的check_call我扔在一起,这似乎工作。

def check_call(*cmd, **kw) 
    _, status = Process.waitpid2 Kernel.spawn(*cmd, **kw) 
    raise "Command #{cmd} #{status}" unless status.success? 
end