本記事では、Linux環境下で、Pythonとそのライブラリ「pyautogui」を用いてRPA(Robotic Process Automation)する例として、LibreOffice Calcを操作する雛形コードを載せました。仮想ソフトVirtualBox上のUbuntuで動作確認しています。
ソフトウェアの起動には、subprocess.Popen()を使用します。ウィンドウのアクティブ化にはxwininfoコマンドを使います。作成したファイルの保存と終了はショートカットキーによるメニューバー操作で自動化を実現します。
下図はその実施例です。文字が斜めにいくつも入力されているのは、RPAで生成した結果です。(ちなみに、本当は日本語入力に変更後に、💩マークを作成したかったのですが、Linux環境下のRPAでは日本語動作が出来ませんでした。Linuxだから日本語使わなくてもいっかということで原因特定まで至っていません)
■本プログラム
Windows環境下での雛形コードは次のリンク先を参照下さい→Python Windows環境下でのRPA「pyautogui」 - PythonとVBAで世の中を便利にする
import os, re
import pyautogui as ag
import subprocess as sp
import time
import random
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d_%H%M%S")
def active_window_func(title):
cmd_list = ['xwininfo', '-tree', '-root', '|', 'grep', title]
cmd = ' '.join(cmd_list)
result = sp.run(cmd, encoding='UTF-8', shell=True,
stdout=sp.PIPE, stderr=sp.PIPE)
app_id = result.stdout.split()[0]
print('app_id', app_id)
cmd_list2 = ['xwininfo', '-id', app_id, '|', 'grep', 'Absolute']
cmd2 = ' '.join(cmd_list2)
result2 = sp.run(cmd2, encoding='UTF-8', shell=True,
stdout=sp.PIPE, stderr=sp.PIPE)
result_list = result2.stdout.split()
print('result_list', result_list)
print(ag.position())
x, y = int(result_list[3]), (int(result_list[7]) - 10)
print('x, y', x, y)
ag.moveTo(x, y, 1)
ag.click()
time.sleep(1)
def libreoffice_calc_func():
file_name = now + '.ods'
save_file_path = dir_path + r'/' + file_name
save_file_path = save_file_path.replace('/', os.sep)
cmd = 'libreoffice --calc'
sp.Popen(cmd.split())
time.sleep(6)
active_window_func('Calc')
ag.write('Hello LibreOffice !!', interval=0.1)
ag.press('enter')
str_list = ['enter', 'down', 'tab']
ag.press(str_list)
ag.write('unnko', interval=0.1)
ag.press('down')
ag.press('up')
ag.hotkey('ctrl', 'c')
for i in range(20):
ag.press('right')
ag.press('down')
ag.hotkey('ctrl', 'v')
ag.hotkey('alt','f')
ag.press('a')
time.sleep(1)
ag.write(save_file_path)
ag.press('enter')
time.sleep(1)
ag.hotkey('alt', 'f')
ag.press('x')
print(save_file_path)
if __name__ == '__main__':
dir_path = os.getcwd()
libreoffice_calc_func()
print('finished')
以上
<広告>
リンク