はじめに
Ruby / PythonなどのLL言語は簡単に開発を始めることができ、多くの便利なライブラリ(正式にはモジュールですので以下モジュール)が開発されています。例えば以下の例が挙げられます。
-
Rubyのモジュール: Nokogiri
使用例: http://shgam.hatenadiary.jp/entry/2013/11/09/192509 -
Pythonのモジュール: NumPy
使用例: http://qiita.com/wellflat/items/284ecc4116208d155e01
このようなモジュールを使うことで、短い時間で開発が可能です。しかし、LL言語の取っ掛かりやすさとは異なり、モジュールの導入はお世辞にも簡単とは言えない現状だと思います。私自身、モジュールのインストール時にエラーが発生し、そのメッセージを元に解決策を探すことが良くあります。解決策が見つかったとしても「よく分からないが何となくこれで直った」という例がしばしばあり、そのような情報だけでは応用がききません。
モジュールインストールは、基本的には単純な作業をするだけなので慣れれば簡単です。しかし自力で問題を解決できるようになるための、まとまった情報が無いようなので記録していこうと思います。
対象
OS: *nix系
言語: Ruby / Python
読者: RubyやPythonをインストールし、プログラムを書き始めてみた人
ゴール
この投稿は、Ruby / Pythonでのモジュールインストールの基本的な知識と、今後起こりうるトラブルに対し応用のきく対応方法を文章化することを目的としています。
モジュールの種類
読者の方ならご存知の通り、モジュールはソースコードの中で以下のように読み込みます。
(例1)
Ruby:
require "some_module"
Python:
import "somemodule"
このように読み込まれるモジュールですが、実際にロードしているファイルによって説明のため以下の2つのパターンに分けることができます。
1. ピュア Ruby / Python モジュール
この場合、(例1)でロードしているファイルはモジュール検索対象ディレクトリ内にある
Ruby:
some_module.rb
Python:
somemodule.py
です。
これらのファイルの中で標準ライブラリ以外モジュールを追加で読み込んでいなければ、そのファイルで依存関係は完結しています。
素のRuby/Pythonコードなので、ご想像付くと思いますがインストールは非常に簡単です。
2. 拡張モジュール
この場合、(例1)でロードしているファイルは、同じくモジュール検索対象ディレクトリにある
Ruby:
some_module.so
Python:
somemodule.so
です。インストールでつまづきやすいモジュールはこれです。
このファイルは、CやC++でコンパイルされたプログラム(実質的には)です。
従って、このような拡張モジュールを使うためにはインストール作業中にCやC++のソースコードをコンパイルする必要があります。
もちろんコンパイル済みのファイル(バイナリ)が提供されていれば必要はありません。しかし、提供されているケースはそれほど多くなく、大抵はコンパイルを行う必要があります。
すなわち、インストール中のコンパイルで発生する問題や依存関係の解決が、Ruby / Python モジュールのインストールトラブルの解決です。
解決策を簡潔にまとめたいところですが、自力で解決をするために、モジュールコンパイル時の問題はどこで発生するのか、依存関係はどこで生じるのかを次にまとめたいと思います。
モジュールはどのように構成されているか
依存関係(Ruby API / Python API)
依存関係(C / C++)
ビルドオプション
モジュールのインストール
案1: OSのパッケージ管理システムを使う
案2: Ruby / Pythonのパッケージ管理システムを使う
インストールに失敗した時の対処
ケーススタディ
ゆっくりペースになると思いますが、随時更新していきます。
(2014.06.17)「モジュールの種類」の内容を追加しました