技術

Snow Leopardの64bit Python2.7でTkinterを使う

ちょっと前にpython.orgで配布しているpython-2.7-macosx10.5.dmgをインストールしてゴキゲンでプログラミングしてたのですが、Tkinterが使えないという事が判明。
具体的には以下のような感じになります。

>>> import Tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 39, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so, 2): no suitable image found.  Did find:
	/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so: no matching architecture in universal wrapper

_tkinter.so: no matching architectureということで確認すると、

$ file /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so: Mach-O universal binary with 2 architectures
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so (for architecture ppc7400):     Mach-O bundle ppc
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so (for architecture i386):        Mach-O bundle i386

なんとx86_64がない。
調べてみるとまたもやbugs.python.orgに64-bit OSX installer is not built with 64-bit tkinterという情報があがってたのでそこを参考に作業してみました。
なんかbugs.python.orgが宝の山にみえてきた。

まず全裸になりますpython.orgからソース(Python-2.7.tar.bz2)をダウンロードして解凍します。

次に解凍した中に入ってるsetup.pyを書き換える訳ですが、参考にした情報ではActivePythonを使う場合のやり方が書かれていて、オフィシャルのソースを使う今回のパターンではビルドできないため、以下のように書き換えました。

ssl_incs = find_file('openssl/ssl.h', inc_dirs,
    ["/usr/include"]
)
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
    ["/usr/lib"]
)

あとは参考にした情報と同じように、MacOSX10.5.sdkとアップルのTcl/Tkを使うように設定。

$ sudo ln -s /System/Library/Frameworks/Tcl.framework /Developer/SDKs/MacOSX10.5.sdk/Library/Frameworks/
$ sudo ln -s /System/Library/Frameworks/Tk.framework /Developer/SDKs/MacOSX10.5.sdk/Library/Frameworks/
$ cd [Python-2.7.tar.bz2の解凍先]
$ export MACOSX_DEPLOYMENT_TARGET=10.5
$ ./configure --enable-framework --enable-universalsdk=/Developer/SDKs/MacOSX10.5.sdk/ --with-universal-archs=intel
$ make

正直なぜMacOSX10.5.sdkを使ってるのか分かりません。そのうちMacOSX10.6.sdkでもビルド出来るか試してみようと思います。

== 追記はじめ ==
MacOSX10.6.sdkで試してみたところ大丈夫でした。さらにTcl.frameworkとTk.frameworkへのリンクも必要ありませんでした。

$ cd [Python-2.7.tar.bz2の解凍先]
$ ./configure --enable-framework --enable-universalsdk=/Developer/SDKs/MacOSX10.6.sdk/ --with-universal-archs=intel
$ make

== 追記おわり ==

ここでsudo make installしてもいいんでしょうけど、万が一すでに入ってる環境が壊れるといやなので、新しくビルドした_tkinter.soがx86_64対応してるか確認して、それだけ挿げ替えるようにします。

$ file build/lib.macosx-10.5-intel-2.7/_tkinter.so
build/lib.macosx-10.5-intel-2.7/_tkinter.so: Mach-O universal binary with 2 architectures
build/lib.macosx-10.5-intel-2.7/_tkinter.so (for architecture x86_64):	Mach-O 64-bit bundle x86_64
build/lib.macosx-10.5-intel-2.7/_tkinter.so (for architecture i386):	Mach-O bundle i386
$ mv /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so.backup
$ cp build/lib.macosx-10.5-intel-2.7/_tkinter.so /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_tkinter.so

ppc対応じゃなくなってるのがアレですが、どうせ使わないのでヨシとします。
これでimport Tkinter出来るようになりました。

コメント

こんちわ〜

またしても同じ問題に出くわしてしまいました。(笑)
ほどほど、目が廻ってきました。。(@_@);;;

どうも!

あまり意識してませんでしたが、Macで標準以外のPythonを使うのって結構罠があるのかもしれませんね〜
答えれる事があれば答えますんで。

なるほど〜

そうでしたか。。
了解しました。取り敢えず、2.6.1を使うようにしてみます。ありがとうございます。

Last login: Sat Jul 23 18:00:58 on ttys000
MacBook-Pro:pyworks p_s_k_e$ /usr/bin/python
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import Tkinter
>>> f = Tkinter.Frame()
>>> 2011-07-23 18:20:03.289 Python[376:1507] Error loading /Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types: dlopen(/Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types, 262): no suitable image found. Did find:
/Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types: no matching architecture in universal wrapper
python: OpenScripting.framework – scripting addition “/Library/ScriptingAdditions/Adobe Unit Types.osax” declares no loadable handlers.

この後にブロックを入れるっと事なんですね?
でも、いったん改行を入れないと、>>>が出ないので。。

調べてみたら、これらと同じ種類の問題のようですね。

http://d.hatena.ne.jp/seuzo/20090918/1253203315
http://pyon316.blogspot.com/2010/04/adobe-unit-typesosax.html

Adobe CS3もしくはCS4付属のAdobe Unit Typesが64bitに対応してないのが原因のようです。
うちもCS4入れてるんですが、Tkinterではエラーは出ないですね。
ただ、上記のリンク先にあるようにosascriptを使った簡単なテストを行ったところ同じエラーが出たので、リンク先の情報にしたがって、

http://kb2.adobe.com/cps/516/cpsid_51615.html

からAdobe Unit Types.osaxの新しいバージョンをダウンロードして、/Library/ScriptingAdditions に上書きコピーし、再起動したらosascriptでのエラーは起きなくなりました。
(Adobe Unit Types.osaxの新しいバージョンはSnow Leopard用と書いてありますが、Lionで試したところ問題なさそうでした)

うちとは状況が微妙に違う(元々Tkinterではエラーは出てない)のでコレで解決出来るかどうかは謎ですが…

あと「ブロックする」というのは、そこで次の>>>が出ない(阻止される)という程度の意味で書きましたんで、あまり気にする必要はないです。
Adobe Unit Types.osaxの問題が解決出来ればあとは他の問題がなければ参考書の通りに進められるかと思います。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください