【问题标题】:Ruby equivalent of Python's subprocess.check_call/check_outputRuby 等效于 Python 的 subprocess.check_call/check_output
【发布时间】:2013-05-16 17:02:48
【问题描述】:

Python 提供了两个方便的函数来调用可能失败的子进程,subprocess.check_callsubprocess.check_output。基本上,

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

将指定的命令生成为子进程、阻塞,并验证子进程是否成功终止(返回零)。如果不是,它会抛出异常。 check_output 做同样的事情,除了它捕获子进程的标准输出并将其作为字节字符串返回。

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

check_callcheck_output 的惯用 Ruby 等价物是什么?我知道 $? 全局变量会给出进程的返回值,但这会很尴尬——重点是有例外是您不必手动检查错误代码。 There are numerous ways to spawn a subprocess in Ruby,但我没有看到任何提供此功能的产品。

【问题讨论】:

    标签: python ruby process subprocess pipe


    【解决方案1】:

    这是我拼凑起来的一个简单的check_call,它似乎有效。

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

    【讨论】:

      【解决方案2】:

      基本/内置方法被POpen4 gem 取代。 shell-executor gem 提供了更多的精彩。

      【讨论】:

      • 我提到“令人敬畏”纯粹是基于对最终用户的功能价值/好处,而不是基于它的来源。但确实,在原始问题的上下文中 - “惯用的红宝石等效” - 这是一个错误的答案,我没有正确解释这个问题,所以可以否决答案。除此之外,我不知道是什么让你开始像“期望低”或“不懂好语言”这样的人身攻击。这不是语言战争,没有人比较 ruby​​ 和 python,这完全不是问题的重点。
      【解决方案3】:

      很难说 Ruby 中最惯用的解决方案是什么……但最接近 Python 的可能是 Shell.execute! 来自 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
      

      这里最显着的区别是 Ruby 等价物没有办法做到 shell=False(并将 args 作为列表),Python 不仅有,而且默认情况下。

      另外,Python 的 e.message 将是默认消息或基于返回码生成的内容,而 Ruby 的 e.message 将是孩子的 stderr

      如果你想做shell=False,据我所知,你必须编写自己的包装器来围绕较低级别的东西;我所知道的所有 Ruby 包装器(shell-executerPopen4、[open4][4])都是 POSIX popen 函数的包装器或模拟器。

      【讨论】:

        猜你喜欢
        • 2013-09-13
        • 1970-01-01
        • 2013-11-30
        • 2018-06-29
        • 2014-10-18
        • 2014-09-02
        • 2015-05-24
        • 1970-01-01
        • 2011-08-18
        相关资源
        最近更新 更多