如何在Rails中调用bash命令时设置系统变量(如$PYTHONPATH)?
我在AWS EC2的Ubuntu上有一个Rails 4的应用。它会通过反引号调用一个Python程序:
pyresult = `python /path/to/abc.py`
这个Python程序在我本地开发环境中运行得很好。但是在生产服务器上,它失败了,而且没有任何错误提示。(pyresult是空的)
我调试了很久,发现一个可能的原因:$PYTHONPATH
在本地,我在我的.bashrc文件中添加了以下内容,这是Python程序要求添加的:
export PYTHONPATH="$HOME/.local/lib/python2.7/site-packages/:$PYTHONPATH"
在服务器上,我也在服务器的.bashrc中添加了这些内容。但是在我的应用中运行echo $PYTHONPATH
却返回了空字符串。
然后我在我的Rails应用中明确添加了:
`export PYTHONPATH="$HOME/.local/lib/python2.7/site-packages/:$PYTHONPATH"`
pyresult = `python /path/to/abc.py`
但是$PYTHONPATH仍然是空的,调用Python程序仍然失败,没有任何错误。
我猜测缺少$PYTHONPATH可能是问题的原因,这个猜测对吗?如果是的话,怎么解决这个问题呢?谢谢大家的帮助。(抱歉,我对Linux不太熟悉,对Python也不太了解)
2 个回答
0
Linux没有系统变量,只有环境变量,而环境变量只会被子进程继承。这行代码
`export PYTHONPATH="$HOME/.local/lib/python2.7/site-packages/:$PYTHONPATH"`
只是为由反引号启动的子shell设置了PYTHONPATH
(以及从这个子shell启动的任何进程)。一旦这个shell结束,PYTHONPATH
的设置就消失了。
你需要使用Ruby提供的某种方式来修改当前进程的环境,我了解到(作为一个不使用Ruby的人)是
ENV['PYTHONPATH'] = '...'
然后由
pyresult = `python /path/to/abc.py`
启动的shell将会从当前的Ruby进程继承它的PYTHONPATH
值。
0
在使用Open4这个工具运行命令后,我发现问题的根本原因是Python程序找不到库,而这个库是通过setup.py安装的。所以这是另一个问题。