2015-09-07 31 views
1

我在Python中有一个子进程,它运行一个Ruby脚本。Ruby从Python子进程运行给出错误版本

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中。会是什么呢?

感谢

+0

SSH进入箱子并运行'哪个ruby'。在脚本中尝试相同的操作。尝试使用完整路径名称来调用要在脚本中使用的Ruby解释器。 – chucksmash

+0

无关:drop'p.wait()'调用。它可能导致程序死锁,并且在这里完全没有必要,请参见[subprocess.call()和subprocess.Popen()之间的区别是否使PIPE对前者的安全性较低?](http://stackoverflow.com/q/32364849/ 4279) – jfs

回答

0

我这样做:

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

这意味着我从RVM的文件夹执行的红宝石。 感谢您的帮助!

2

rvm作品钩子注入你的shell。这通常在您的.bash_profile中完成(请参阅here)。

Bash可能是您的默认外壳,但无论如何,您的.bash_profileis only read by your shell if it's a login shell,其中由subprocess.Popen产生的外壳不是。换句话说,rvm根本没有被加载,当您使用subprocess.Popen

为了解决您的问题,你应该明确地调用rvm

rvm 2.2.1 do ruby ... 

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

这是记录在the rvm scripting documentation

+0

尝试过,但我得到“朗姆酒未找到”。我会发布我如何解决它。 – facumedica