如果找不到 python,或者系统默认得 python 是 3.x (比如 Arch Linux),手动制定下路径
RubyPython.configure python_exe: '/usr/bin/python2.7'
对于 rails 项目比如 ruby-china,可以把这行代码丢到config/initializers
下。
不过RubyPython
仍然可能找不到 libpython 而提示lib.so not found
。这是由于RubyPython
确定正确 libpython 的规则和你的系统不兼容,可以通过手动加些 symbol links 来解决 (目前RubyPython
的 git 最新代码相对当前稳定版本 0.5.3 改动非常大,希望新版本能解决这个问题,就先不去提交 fixing 了)。
可以参考 PythonExec initialize 方法中的规则来建 symbol link.
首先运行该 python,得到版本号x.y
,以python2.7
为例
$ python2.7 -c "import sys;print '%d.%d' % sys.version_info[:2]"
=> 2.7
找到该 python 对应得 libpython,可以用工具ldd
:
$ ldd /usr/lib/python2.7 | grep python
=> libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0
为找到的这个文件创建链接。下面用#{exe_base}
表示通过RubyPython.configure
指定的 python 可执行程序的文件名部分,#{x}
和#{y}
是通过运行这个 python 找到得版本号,#{libpython}
是该 python 对应得 libpython 库文件路径。
sudo ln -s #{libpython} /usr/lib/lib#{exe_base}#{x}#{y}.so
sudo ln -s #{libpython} /usr/lib/lib#{exe_base}#{x}.#{y}.so
以我的环境 (Arch Linux) 为例,exe_base
是python2.7
,版本号 x.y 是 2.7,libpython 是/usr/lib/libpython2.7.so.1.0
,
sudo ln -s /usr/lib/libpython2.7.so.1.0 /usr/lib/libpython2.727.so
sudo ln -s /usr/lib/libpython2.7.so.1.0 /usr/lib/libpython2.72.7.so