Kinaconの技術ブログ

Ubuntuはじめました。

pythonで端末画面を保存する。

ブログにコマンドラインを貼り付けるとき
以下の作業を毎回行っていた。


結構めんどいので、自動化しようと思う。

pythonの勉強がてら端末画面切り出しアプリを作ってみます。

pythonスクリーンショットの取り込み

まずは、スクリーンショットの取り込みです。
pythonではPyAutoGuiを使用するとスクリーンショットが取得できるようです。

PyAutoGuiのインストール

PyAutoGuiはpipでインストールする。

sudo apt install python-xlib scrot
pip install pyautogui

コード

import pyautogui

sc = pyautogui.screenshot()
sc.save('screen.png')

pythonでアプリケーションの座標取得

次は端末画面のみをスクショするため、端末の位置座標を取得します。
subprocessでxwininfoを使用すれば取得できるようです。

from subprocess import Popen, PIPE
import re

cmd =  ["xwininfo", "-name", terminal_name]

p = Popen(cmd, stdout = PIPE, stderr = PIPE)
ret = str(p.communicate())

coord = re.search('X:\s+(\d+)[^Y]+Y:\s+(\d+)', ret)
appwin_x,appwin_y = coord.groups()

完成

# -*- coding: utf-8 -*-

import os
import sys
import re
from subprocess import Popen, PIPE
import pyautogui

class SaveTerminal():
    def __init__(self, argvs):
        self.argvs = argvs
        
        # コマンドライン引数の判定処理
        if len(self.argvs) == 2:
            filename = argvs[1]
            if os.path.splitext(filename)[1] != '.png':
                filename = os.path.splitext(filename)[0]  + ".png"
                
        elif len(self.argvs) == 1:
            filename = "default.png"
            
        elif len(self.argvs)  > 2:
            print("エラー:引数は1つです。")
            exit()
        
        # osでユーザ名、コンピュータ名、カレントディレクトリを取得する。
        user = os.getlogin()
        host = os.uname()[1]
        cdir = os.getcwd().replace("/home/"+user, "~")

        # ターミナルの名前
        terminal = user + "@" + host +": " + cdir

        # コマンド
        cmd =  ["xwininfo", "-name", terminal]

        # subprocessでのxwininfoの情報を取得する
        p = Popen(cmd, stdout = PIPE, stderr = PIPE)
        ret = str(p.communicate())

        # xwininfoの情報から正規表現で端末の左上の座標を取得する
        coord = re.search('X:\s+(\d+)[^Y]+Y:\s+(\d+)', ret)
        appwin_x,appwin_y = coord.groups()

        # xwininfoの情報から正規表現で端末のサイズを取得する
        coord = re.search('Width:\s+(\d+)[^Y]+Height:\s+(\d+)', ret)
        appwin_w,appwin_h = coord.groups()

        # 切り出す領域を指定する。
        # このアプリを呼び出す行は不要なのでサイズを高さを短くしている
        input = (int(appwin_x), int(appwin_y), int(appwin_w), int(appwin_h)-33)

        sc = pyautogui.screenshot(region=input)
        sc.save(filename)

        print("端末画面を「" + filename + "」で保存しました。")

if __name__ == "__main__":
        argvs = sys.argv
        SaveTerminal(argvs)

引数にファイル名を入れればその名前で保存できます。

以上。

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで