Gem 解决 pygments.rb (RubyPython) 找不到 libpython 的问题

doitian · 2011年12月01日 · 最后由 EvanYa 回复于 2016年10月19日 · 6650 次阅读

如果找不到 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_basepython2.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

我觉得 ruby 项目直接依赖一个 python 库就是悲剧阿

谢谢 @doitian 分享,收藏之~,依赖 python 库说明还有很多我们没有做好或者没有做到的地方。

#2 楼 @lgn21st #1 楼 @Rei 我还纳闷这个 gem 是干嘛的呢。。。。

才看到,感谢 @doitian 分享.... pygments 是我们心中的痛....

#4 楼 @poshboytl 因为 Python? 何必这么介怀呢

#5 楼 @huacnlee 其实是一种羡慕嫉妒但是不恨.... 就像 python 羡慕咱家的 Rspec....

问题找到这给解决了,感谢

请问楼主如果 rubypython 想先传入参数值给 python 然后在吧返回值传出来应该怎么写?官方文档没看懂😂 😂 😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册