読者です 読者をやめる 読者になる 読者になる

ha's notepad II

メモ書きです。

GraphillionをWindowsにインストールしようとしてる

GraphillionをWindowsPython 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使ったほうがよさげです。まだ動作してないけど。詳しくは続編へ。