运行Simple Synteny的SyntenyDrawer.rb时遇Magick相关错误求助
解决Simple Synteny中RMagick初始化报错:
undefined method 'density=' for main:Object 问题原因
报错的核心是新版RMagick(3.x及以上)修改了Magick::Image.new块的上下文规则:旧版RMagick中,Image.new块内的self指向创建的Image实例;但新版中self指向全局main对象,导致self.density = $DPI找不到对应方法。
解决方案
方案1:修改代码适配新版RMagick
找到SyntenyDrawer.rb第1442行的代码:
canvas = Magick::Image.new(img_width, img_height) {self.density = $DPI}
替换为以下两种写法之一:
写法A:显式用块参数引用Image实例
canvas = Magick::Image.new(img_width, img_height) { |image| image.density = $DPI }
写法B:使用关键字参数(RMagick 3.0+支持)
canvas = Magick::Image.new(img_width, img_height, density: $DPI)
修改后重新运行程序即可。
方案2:安装兼容旧版RMagick(无需修改代码)
如果不想改动程序代码,可以安装适配原代码的旧版RMagick(2.x系列),步骤如下:
- 卸载当前RMagick版本:
gem uninstall rmagick
- 安装旧版RMagick依赖的ImageMagick 6:
sudo apt-get install imagemagick-6.q16 libmagickcore-6.q16-dev libmagickwand-6.q16-dev
- 安装兼容的RMagick版本:
gem install rmagick -v 2.16.0
安装完成后重新运行SyntenyDrawer.rb即可。
额外检查
- 确认Ruby 2.7.x版本符合Simple Synteny的要求(2.5-2.7版本均兼容);
- 确保程序中
$DPI变量已正确定义,避免因变量未赋值引发其他问题。
内容的提问来源于stack exchange,提问作者João Paulo Vieira
相关产品推荐
相关产品推荐

