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。
感谢您的帮助!
我在 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。 感谢您的帮助!