CC56

CC56: 567収束までに達成したい56リスト

【iterm】use imgcat with Python in tmux / tmux 内での Python による imgcat で画像を表示させる方法

Solution

If your iterm can't show images, to solve it, write os.environ['TMUX'] = 'tmux' before calling imgcat() in your python script.

import os
os.environ['TMUX'] = 'tmux' # insert this line

imgcat(img)

f:id:hyper-pigeon:20211202105227p:plain
With interpreter, before assigning os.environ couldn't show images. On the other hand, after showed a white image created numpy.

概要

英語で調べても出てこなかったので、海外の方のために一応英語で書いたりしてます(これ以降は読まないと思うので、ここからは日本語で書きます)。

iterm上で画像を表示させるimgcat、便利だと思います。 また、imgcat には、Pythonで叩けるモジュール、『imgcat · PyPI』があります。 便利なため著者はよく、とりあえずDockerに入れています。

しかし、tmux 内だとおかしな挙動をしたり表示されなかったりとTwitterでよく書かれています。 これを解決する方法がどう調べても出てこなかったのですが、imgcat · PyPI の公式実装を読んだところ、解決したので共有します。

imgcat

imgcat (Python)の使い方は簡単です。imgcat を import して画像を関数 imgcat() に渡すだけです。

(1) Dockerfileとかに以下を追記します。

imgcat==0.5.0

(2) numpyで白塗りの画像を作成、表示

import numpy as np
from imgcat import imgcat

img = np.ones(shape=[128, 128, 3], dtype=np.uint8)*255
imgcat(img)
  • uint8で処理されるため、画像のレンジに注意しましょう

tmux

tmux は幅広く使われており、とくに深層学習などの計算時間の必要なプログラムとは切り離せない関係だと思っています。

しかし、ペインなどの関係から imgcat との相性が悪く、画像が表示されないことがあります。 そのため、一度画像を plt.imsave() などで保存してから vscode で確認したり、そもそも jupyter notebook で実験を行ったり…という別の方法で解決しがちです。

公式実装との関係

最初に書いたとおり、imgcat() を呼ぶ前に os.environ['TMUX'] = 'tmux' を指定すると解決します。

公式実装のこの辺を読んで解決しました。

github.com

デフォルトだと、os.environtmux が入っていないので、プログラム上で指定する必要があるということですね。(ターミナル上にバイナリとかで書き出したりする詳しい仕様・原理はよくわかってないです)

何か気づいたことがあったらTwitter等で気軽に教えて下さい。

備考・補足

ペインを切ったり、ずらしたりするとまた表示がおかしくなったりするので、それにも対処できるようにしたい。 (現状はペイン切りなしならtmux上で表示される、という応急対処)