【问题标题】:Ruby running from Python subprocess giving wrong version从 Python 子进程运行的 Ruby 给出了错误的版本
【发布时间】:2015-12-03 07:04:48
【问题描述】:

我在 Python 中有一个子进程,它运行一个 Ruby 脚本。

import subprocess
cmd="ruby -v"
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, env={ 'PATH': '/sbin:/bin:/usr/bin' })
p.wait()
output, errors = p.communicate()
status = 'Estado de la app: ' + str(output) + 'Errores: ' + str(errors)
return status

问题在于它提供了错误的 Ruby 版本。它在服务器上运行,所以通过 SSH 我安装了 Ruby 2.2.1 和 rvm,当我运行 ruby -v 时,它给了我正确的信息。但是当我从 web2py 运行 python 时,它给了我一个旧版本的 Ruby,它是 /usr/bin/ruby 中的那个。

这就像子进程在一个完全不同的外壳中运行。会是什么?

谢谢

【问题讨论】:

标签: python ruby subprocess


【解决方案1】:

rvm 通过将钩子注入到您的外壳中来工作。这通常在您的.bash_profile 中完成(请参阅here)。

Bash 可能是您的默认 shell,但无论如何,您的 .bash_profile is only read by your shell if it's a login shell 不是由 subprocess.Popen 生成的 shell。换句话说,当你使用subprocess.Popen时,根本不会加载rvm

要解决您的问题,您应该显式调用rvm

rvm 2.2.1 do ruby ...

(例如,在您的情况下为 rvm 2.2.1 do ruby -v

这在the rvm scripting documentation中有记录。

【讨论】:

  • 试过了,但我得到“找不到朗姆酒”。我会发布我是如何解决的。
【解决方案2】:

我这样做了:

/usr/local/rvm/wrappers/ruby-2.2.1/ruby /scripts/myscript.rb

这意味着我从 rvm 文件夹中执行 ruby​​。 感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多