gpt4 book ai didi

python - 从 Python 子进程运行的 Ruby 给出错误版本

转载 作者:行者123 更新时间:2023-12-01 04:30:41 26 4
gpt4 key购买 nike

我有一个 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 使用 rvm 安装了 Ruby 2.2.1,当我运行 ruby​​ -v 时,它给了我正确的信息。但是当我从 web2py 运行 python 时,它给了我一个旧版本的 Ruby,即/usr/bin/ruby 中的版本。

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

谢谢

最佳答案

rvm 的工作原理是将钩子(Hook)注入(inject)到 shell 中。这通常在 .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中.

关于python - 从 Python 子进程运行的 Ruby 给出错误版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com