python3.5でpyobjcのコードを動かそうとしたら Symbol not found: _PyObject_REPR
はじめに
python3.5でpyobjcのコードを動かそうとした際に、以下のようなエラーが出てしまっていた。
Symbol not found: _PyObject_REPR
結論からいうとパッケージが古かったので更新した。(3.0.4 -> 3.1.1)
stack overflowで該当する質問
- python - Symbol not found: _PyObject_REPR when calling pyobjc function, Python3.5.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が動くようになった。