QA@IT

Herokuでpygments.rbを使用すると「undefined method `Py_IsInitialized' for RubyPython::Python:Module」エラー

2966 PV

Heroku上でコードハイライトのページへアクセスすると「undefined method `Py_IsInitialized' for RubyPython::Python:Module」エラーとなります。。(heroku logsにて確認)

おそらくStack Overflowに上がっている下記の質問とほぼ同じ事象かと思われます。。

ruby on rails 3.1 - How to use Pygments.rb on Heroku? - Stack Overflow

ruby - undefined method `Py_IsInitialized' for RubyPython::Python:Module - Stack Overflow

◆環境情報

ruby -v

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin10.8.0]

rails -v

Rails 3.2.6

heroku info

=== markdown-sample
Addons:        Shared Database 5MB
Domain Name:   markdown-sample.herokuapp.com
Git URL:       git@heroku.com:markdown-sample.git
Owner:         xxxxxxxxxx@gmail.com
Repo Size:     9M
Slug Size:     14M
Stack:         cedar
Web URL:       http://markdown-sample.herokuapp.com/

◆関連コード

Gemfile

  # For Markdown
  gem 'redcarpet'
  gem "pygments.rb", "~> 0.2.13"

app/controllers/application_controller.rb

  private

  #---------------#
  # show_markdown #
  #---------------#
  def show_markdown( text )
    html_render = HtmlWithPygments.new( hard_wrap: true, filter_html: true )
    markdown = Redcarpet::Markdown.new( html_render, autolink: true, fenced_code_blocks: true )

    return markdown.render( text )
  end

  helper_method :show_markdown

app/models/html_with_pygments.rb

# coding: utf-8
class HtmlWithPygments < Redcarpet::Render::HTML

  #------------#
  # block_code #
  #------------#
  def block_code( code, language )
    Pygments.highlight( code, lexer: language, options: { encoding: 'utf-8' } )
  end

end

app/views/pages/show.html.erb

  <%= raw show_markdown( @page.content ) %>

◆各URL

Herokuデプロイ済みサイト

GitHubソースコード

アプリケーション作成手順


何か解決法はありますでしょうか?

回答

回答を参考にした、最終的な解決法。

参考:http://change-the-world.heroku.com/47

Gemfile

# For Markdown
gem 'redcarpet'
gem "pygments.rb"          # => 0.2.3
gem "rubypython", "0.5.1"  # For Heroku

config/application.rb

    # For Heroku
    RubyPython.configure python_exe: 'python2.6'

[ 追記(2012/06/27) ]

Gemにしました。

GitHub:https://github.com/shu0115/markdown-scaffold
RubyGems:https://rubygems.org/gems/markdown-scaffold

編集 履歴 (1)

Gemfile で rubypython のバージョンを 0.5.1 に固定してみてはどうでしょうか。rubypython の問題で動かないようです。

編集 履歴 (0)
  • ありがとうございます。
    rubypythonを0.5.1に落として(依存関係のためpygments.rbも0.2.3に落として)、「RubyPython.configure python_exe: 'python2.6'」を追加したらHerokuでも動きました。
    -

根本解決ではありませんが
シンタックスハイライトのgemを coderay に変更する手もあるようです。
http://gemfile-freaks.herokuapp.com/gemfiles/1 を参考にしました。

app/models/html_with_pygments.rb

diff --git a/app/models/html_with_pygments.rb b/app/models/html_with_pygments.rb
index 35706eb..629a73e 100644
--- a/app/models/html_with_pygments.rb
+++ b/app/models/html_with_pygments.rb
@@ -6,7 +6,7 @@ class HtmlWithPygments < Redcarpet::Render::HTML
   #------------#
   # コードハイライト
   def block_code( code, language )
-    Pygments.highlight( code, lexer: language, options: { encoding: 'utf-8' } )
+    CodeRay.scan(code, language).div
   end

Gemfile

diff --git a/Gemfile b/Gemfile
index c41fbae..8eb00c1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -56,4 +56,4 @@ end

 # For Markdown
 gem 'redcarpet'
-gem "pygments.rb", "~> 0.2.13"
+gem 'coderay'

Gemfile.lockは省略します。

編集 履歴 (1)
  • ありがとうございます。
    Gemのバージョンを落としたらHerokuでも動いたので、とりあえずpygments.rbでいこうと思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。