🙄
macOS の matplotlib (MacPorts) で X11 を要求される問題を回避する
背景
matplotlib を使っているコードで、プロットを表示する際に X11 を要求するものがあった。具体的には、X11を起動していないと以下のようなメッセージ(couldn't connect to display ":0"
)が表示される。
% python pyplaut.py
Traceback (most recent call last):
File "/Users/funa/Downloads/auto/07p/python/auto/graphics/pyplaut.py", line 605, in <module>
runner = PyPlautInteractiveConsole(exportFunctions(), b, s)
File "/Users/funa/Downloads/auto/07p/python/auto/graphics/pyplaut.py", line 26, in __init__
root=Tkinter.Tk()
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 2299, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display ":0"
~/.matplotlib/matplotlibrc
に以下を記述しても X11 を要求されてしまう。
backend: MacOSX
解決方法
X11.app
を起動しておけば動くが、できれば macOS native なGUIで使いたい。stackoverflow のコメント が役に立った。
原因を調べてみたところ、matplotlib で
matplotlib.use('TkAgg')
の様に TkAgg
決め打ちで書かれているコードの場合、上記問題が発生していた。MacPorts の tk
はデフォルトで X11 を使用する ことになっていたので、 -x11 +quartz
を付けてインストールし直せばよい(+x11
と +quartz
は conflict するので同時に設定できない)。
% sudo port install tk -x11 +quartz
これで AUTO のプロットも macOS native なGUIで表示されるようになった。
考察
tk +x11 が必要な portsを使う際には、以下の様なコマンドを実行して tk
の variant を切り替えればよいか。
% sudo port deactivate tk @8.6.12_0+quartz
% sudo port activate tk @8.6.12_0+x11
Discussion