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

python3.5でpyobjcのコードを動かそうとしたら Symbol not found: _PyObject_REPR

はじめに

python3.5でpyobjcのコードを動かそうとした際に、以下のようなエラーが出てしまっていた。

Symbol not found: _PyObject_REPR

結論からいうとパッケージが古かったので更新した。(3.0.4 -> 3.1.1)

stack overflowで該当する質問

現在の状態

個人的にmacportsを使っている。

$ port installed | grep pyobjc
  py35-pyobjc @3.0.4_0 (active)
  py35-pyobjc-cocoa @3.0.4_0 (active)

portfileの書き換え

pypiを見たら最新は3.1.1だったのでそれを使うように書き換える。pipで単にインストールしても良いけれど。拡張ライブラリが含まれたようなものはその環境固有の方法で管理したほうが良い気がしている。

ここに書いてある作業に従ってportfileを書き換えれば良い

$ cd `port dir py35-pyobjc-cocoa`
$ sudo cp -p Portfile Portfile.orig
# versionの書き換え
$ sudo port edit py35-pyobjc-cocoa
$ sudo port -d checksum py35-pyobjc-cocoa
# distのchecksumの方に書き換える
$ sudo port edit py35-pyobjc-cocoa
$ sudo port -d install py35-pyobjc-cocoa

$ cd `port dir py35-pyobjc`
$ sudo cp -p Portfile Portfile.orig
# versionの書き換え
$ sudo port edit py35-pyobjc
$ sudo port -d checksum py35-pyobjc
$ sudo port -d livecheck py35-pyobjc
# distのchecksumの方に書き換える
$ sudo port edit py35-pyobjc
$ sudo port -d install py35-pyobjc

portfileを書き換えたらインストールする。

versionの書き換え

3.0.4 -> 3.1.1

checksumの書き換え

checksumを実行してわざと失敗させて新しいchecksumの値を取るのが便利。以下のような出力からDistfile ... の部分を取り出す。

Portfile checksum: pyobjc-core-3.1.1.tar.gz rmd160 12ee6d8132c59420c768dafdb2ee73f17ea97cc1
Distfile checksum: pyobjc-core-3.1.1.tar.gz rmd160 20a806aed2a7396ca86ca680060947ff6b48eccb
DEBUG: Calculated (sha256) is 07c4e9c4fa5bec881cd86bf1b7dbcdb306b16567b490d06fa538c0d1b2677d2e
Error: Checksum (sha256) mismatch for pyobjc-core-3.1.1.tar.gz
Portfile checksum: pyobjc-core-3.1.1.tar.gz sha256 a4708886ff7844ff7537c60d14e903014a90b3e3cdbad5e717acfcbe150768b7
Distfile checksum: pyobjc-core-3.1.1.tar.gz sha256 07c4e9c4fa5bec881cd86bf1b7dbcdb306b16567b490d06fa538c0d1b2677d2e

結果

$ port installed | grep pyobjc
  py35-pyobjc @3.0.4_0
  py35-pyobjc @3.1.1_0 (active)
  py35-pyobjc-cocoa @3.0.4_0
  py35-pyobjc-cocoa @3.1.1_0 (active)

hello worldが動くようになった。