如何在Rails中调用bash命令时设置系统变量(如$PYTHONPATH)?

0 投票
2 回答
2125 浏览
提问于 2025-04-19 19:10

我在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安装的。所以这是另一个问题。

撰写回答