GraphillionをWindowsにインストールしようとしてる
GraphillionをWindowsのPython 2.7(amd64)にインストールしようとしたメモ。
> easy_install graphillion
とコマンドを打てばいいようだが、走らせてみたところ以下のようなエラーが出てビルドに失敗した。
File "C:\Python27\lib\distutils\msvc9compiler.py", line 299, in query_vcvarsall raise ValueError(str(list(result.keys()))) ValueError: [u'path']
ソースをダウンロードして、python setup.py buildのコマンドで自分でビルドしようとしても、やはり同じエラーで止まった。どうもVC9でのコンパイルに失敗しているようだ。
エラーの文で調べると、同じような場所でつまづいている先人がいた。
Windows 7 x64にMercurialからgitを操作できるhg-gitをインストールする - digital matter
msvc9compiler.pyにパッチを当てれば解決するらしい。実際に現在使っていたmsvc9compiler.pyをのぞくと、この修正は適用されていなかった。そこでパッチを当てる。さらに追加で、
KEY_BASE = r"Software\Microsoft\\"
と前方に追加しないと、
NameError: name 'KEY_BASE' is not defined
というエラーが出るので、KEY_BASEという変数が出てくるより前に入れる。
これでMSVC9を用いてビルドを試みると、以下のエラーが出る。
src\pygraphillion.cc(464) : error C3861: 'strtoll': identifier not found src\pygraphillion.cc(482) : error C2039: 'data' : is not a member of 'std::vecto r<_Ty>' with [ _Ty=char ]
最初のエラーだが、これはMSVCのstdlib.hにstrtollという関数が無いためである。_strtoi64という関数が代替で使えるので、Graphillionのソースコード(src/pygraphillion.cc)を書き換える。
#if defined(_MSC_VER) #define strtoll _strtoi64 #endif
の3行を最初に加えれば大丈夫。
次のエラーだが、以下の部分が原因のようだ。
static PyObject* setset_len2(PySetsetObject* self, PyObject* args) { PyObject* obj = NULL; if (!PyArg_ParseTuple(args, "|O", &obj)) return NULL; if (obj == NULL || obj == Py_None) { string size = self->ss->size(); vector<char> buf; for (string::const_iterator c = size.begin(); c != size.end(); ++c) buf.push_back(*c); buf.push_back('\0'); return PyLong_FromString(buf.data(), NULL, 0); } else if (PyInt_Check(obj)) { int len = PyLong_AsLong(obj); RETURN_NEW_SETSET(self, self->ss->size(len)); } else { PyErr_SetString(PyExc_TypeError, "not int"); return NULL; } }
調べてみると、vector::dataという関数が、VC9では使えないのか・・・?
Windowsで環境構築するのはほんと骨折れます。Ubuntuならeasy_install一発で済むのに。でもOSを複数入れると、切り替えが面倒でなぁ・・・
[追記09/12] Anaconda使ったほうがよさげです。まだ動作してないけど。詳しくは続編へ。