Ruby 运行 来自 Python 子进程给出了错误的版本

Ruby running from Python subprocess giving wrong version

我在 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 版本。这个 运行s 在服务器上所以通过 SSH 我用 rvm 安装了 Ruby 2.2.1,当我 运行 ruby -v 它给了我正确的信息。但是当我 运行 来自 web2py 的 python 它给了我一个旧版本的 Ruby,这是 /usr/bin/ruby.

中的那个

它就像一个完全不同的 shell 中的子进程 运行。可能是什么?

谢谢

rvm 通过将钩子注入您的 shell 来工作。这通常在您的 .bash_profile 中完成(参见 here)。

Bash 可能是您的默认值 shell,但无论如何,您的 .bash_profile is only read by your shell if it's a login shell,由 subprocess.Popen 生成的 shell 是't。换句话说,当您使用 subprocess.Popen

时,根本不会加载 rvm

要解决您的问题,您应该明确调用 rvm:

rvm 2.2.1 do ruby ...

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

这在 the rvm scripting documentation 中有记录。

我这样做了:

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

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