Open Babelのビルドとインストール
Open Babel は化学で使われる分子フォーマット間の変換によく使われるソフトです。
開発されたばかりの機能を使うためには自分でビルドしてインストールする必要があるのですが、Pythonバインディングをコンパイルするところにハマったのでメモしておきます。 基本的にはInstall Open Babelを見ればいいです。 環境はUbuntu 16.04を使いました。
Anacondaでリリース済みバージョンを使う
Anacondaをインストールしていれば
conda -c openbabel openbabel
とすればよいです。
自分でコンパイルする
Anacondaを使っていない場合
必要なライブラリをインストールします。
sudo apt install cmake python-dev libxml2-dev zlib1g-dev libeigen2-dev libcairo2-dev swig2.0
ビルドとインストールは以下のようにします。
git clone https://github.com/openbabel/openbabel.git cd openbabel mkdir build cd build cmake .. -DPYTHON_BINDINGS=ON make sudo make install echo 'export PYTHONPATH=/usr/local/lib:$PYTHONPATH' >> ~/.bashrc source ~/.bashrc
pythonを起動して import openbabel
を実行してエラーが起きなければ成功です。
(2019/11/22 追記) Open Babel 3.0のリリース時点ではSWIGがないとPythonバインディングがコンパイルできないようです。 Python bindings don't build in the 3.0 release tarball due to incorrect path · Issue #2081 · openbabel/openbabel · GitHub
sudo apt install build-essentials cmake python3-dev libeigen3-dev swig wget wget https://github.com/openbabel/openbabel/archive/openbabel-3-0-0.tar.gz tar xf openbabel-3-0-0.tar.gz cd openbabel-openbabel-3-0-0/ mkdir build; cd $_ cmake .. -DPYTHON_BINDINGS=ON -DRUN_SWIG=ON make sudo make install echo 'export PYTHONPATH=/usr/local/lib:$PYTHONPATH' >> ~/.bashrc source ~/.bashrc
でコンパイルできました。
Anacondaを使っている場合
Pybel import crashes Anaconda Python3.6 Ubuntu · Issue #1805 · openbabel/openbabel · GitHub に書いてあります。
conda install cmake lxml swig cmake .. -DPYTHON_BINDINGS=ON -DRUN_SWIG=ON -DCMAKE_INSTALL_PREFIX=~/anaconda3 -DPYTHON_INCLUDE_DIR=~/anaconda3/include/python3.6m/ -DCMAKE_LIBRARY_PATH=~/anaconda3/lib -DSWIG_DIR=~/anaconda3/share/swig/3.0.12/ -DSWIG_EXECUTABLE=~/anaconda3/bin/swig -DPYTHON_LIBRARY=~/anaconda3/lib/libpython3.6m.so make && make install
C++で使う
インストールすると obabel
などの通常のコマンドラインツールが使えるようになります。
より複雑なことをするにはC++やPythonなどでコードを書くことになります。 以下に標準入力からSMILESを読んで、3次元座標を計算した後、標準出力にSDFを吐くコード例を示します。 エラー処理は省略しています。
#include <iostream> #include <openbabel/mol.h> #include <openbabel/obconversion.h> #include <openbabel/builder.h> int main(int argc,char **argv) { OpenBabel::OBConversion conv(&std::cin, &std::cout); OpenBabel::OBMol mol; OpenBabel::OBBuilder builder; conv.SetInAndOutFormats("SMI", "SDF"); conv.Read(&mol); builder.Build(mol); conv.Write(&mol); }
コンパイルは以下のように行います。ディレクトリは環境によって異なるかもしれません。
g++ -I /usr/local/include/openbabel-2.0/ -L /usr/local/lib/openbabel/2.4.90/ hoge.cpp -lopenbabel
Makefileの例を示します。ディレクトリ名は適宜変更してください。
CC = g++ CXXFLAGS = -I /usr/local/include/openbabel-2.0/ LDFLAGS = -L /usr/local/lib/openbabel/2.4.90/ LDLIBS = -lopenbabel all: hoge fuga
SMILESをstringで指定する例
#include <iostream> #include <string> #include <sstream> #include <openbabel/mol.h> #include <openbabel/obconversion.h> #include <openbabel/builder.h> int main(int argc, char** argv){ std::string smiles = "FCl(=O)=O"; std::stringstream ss(smiles); OpenBabel::OBConversion conv(&ss, &std::cout); conv.SetInAndOutFormats("smi", "sdf"); OpenBabel::OBMol mol; conv.Read(&mol); OpenBabel::OBBuilder builder; builder.Build(mol); conv.Write(&mol); }