PythonでExcel読み込みや編集を行う
先日PythonでExcelシートを作成の上、グラフを作成・出力する方法をまとめました。
elsammit-beginnerblg.hatenablog.com
今回は書き込みとは新規作成とは逆にExcelファイルの読み込みに関してまとめていきたいと思います。
さらに、読み込んでいるファイルに対する追記もまとめます。
■環境構築
今回も前回と同様に、openpyxlを用います。
openpyxlに関しては前回まとめましたので割愛。
インストール下記コマンドでOK。
pip install openpyxl
■Excelファイル読み込み
では早速Excelファイルからデータを読み込んでみたいと思います!!
Excelファイル名ですが、test.xlsxとし、ファイル内には、
が書き込まれているものとします。
コードはこちら。
import openpyxl FILENAME = "test.xlsx" def ReadExcel(): wb = openpyxl.load_workbook(FILENAME) sheet = wb['Sheet1'] count = 1 while True: cell = sheet["A"+str(count)] print(cell.value) count+=1 if cell.value == None: print("finish") return execlist = cell.value.split("\n") #return ReadExcel()
Excelファイルを読み込むコードは、
wb = openpyxl.load_workbook(FILENAME)
になります。
その後、シートを
sheet = wb['Sheet1']
にて指定します。
"Sheet1"はExcelのシート名になります。
シート内の値は、
cell = sheet[セル値] value = cell.value
で取得できるので、"セル値"に読み出したい値を指定すればOKです。
今回はA列を読み出したいので、
count = 1 while True: cell = sheet["A"+str(count)] print(cell.value) count+=1 if cell.value == None: print("finish") return execlist = cell.value.split("\n")
といったコードとしました。
本コードでは、
A1、A2、A3、、、
に書き込まれている値を読み出しています。
A**が空欄であった場合、Noneになるので、
空欄であったらwhile文を抜けるようにしました。
最後に、
cell.value
にて取得した値は文字列で取得できるので、
セル内が複数行文字が下記まれていた場合には、
split("\n")で改行毎に分割が行えます。
こちらのコードを実行すると、
Hello World AAA BBB CCC None finish
といった結果が得られるかと思います。
■Excelファイルへの追記
次にすでに存在するExcelファイルへ追記する方法です。
Excelファイルは先ほどのtext.xlsxを用います。
実施することは、
・A列にoが含まれている場合にはYes、含まれていない場合にはNoをB列に書き込み
を行う。とします。
コードはこちら。
import openpyxl FILENAME = "test.xlsx" def ReadAndWrite(): wb = openpyxl.load_workbook(FILENAME) sheet = wb['Sheet1'] count = 1 while True: cell = sheet["A"+str(count)] print(cell.value) if cell.value == None: print("finish") wb.save(FILENAME) return writeResult = "OK" if "o" in cell.value: writeResult = "NG" sheet['B' + str(count)] = writeResult count+=1 ReadAndWrite()
先ほどと同様に、
wb = openpyxl.load_workbook(FILENAME)
sheet = wb['Sheet1']
でExcelファイル内シートを選択し、
cell = sheet["A"+str(count)]
でセルを読み出します。
そして、
writeResult = "OK" if "o" in cell.value: writeResult = "NG" sheet['B' + str(count)] = writeResult count+=1
でセル内の値に"o"が含まれている場合にはYesそれ以外はNoを書き込みます。
書き込んでいるコードは、
sheet['B' + str(count)] = writeResult
です。
書き込む際は.valueを付ける必要はないです。
whileループでA列が空欄(None)になるまで続け、
空欄を検知したら、
wb.save(FILENAME)
で追記した結果を保存して終了させています。
本コードを実行すると、
といった結果が得られ、想定通りB列にOK/NGが書き込まれているかと思います。
■最後に
今回はExcelファイルの読み出しと追記に関してまとめてみました。
読み出し・追記もopenpyxlを使用すれば簡単でした。
これで大体のエクセル操作は出来るようになったかな?
他に使いたい機能とか出てきたら調べた上でブログにまとめたいと思います。
Pythonを用いて画像認識で操作を自動化してみる
先日から操作の自動化方法について調べて試してみたりしています。
elsammit-beginnerblg.hatenablog.com
elsammit-beginnerblg.hatenablog.com
今回はあらかじめ用意した画像を認識し、画像を手掛かりに操作を自動化する方法についてまとめていきます。
今回も用いるライブラリはPyAutoGUIです。
自動操作を行う上でPyAutoGUIは便利ですね。
■画像認識を組み合わせて操作を自動化
では早速画像認識を組み合わせて操作を自動化してみたいと思います。
自動化する手順ですが、
vscodeを起動→新しいファイルを生成→任意の文字列を入力→ファイルを保存
とします。
コードはこちら。
import pyautogui import time #vscodeを起動 pyautogui.press('win') pyautogui.write('vscode') time.sleep(0.5) pyautogui.press('enter') #vscode上で新しいファイルを生成 while pyautogui.locateOnScreen('vscode.png', confidence=0.9) is None: time.sleep(1) pos = pyautogui.locateOnScreen('vscode.png', confidence=0.9) pyautogui.click(pos) #任意の文字を入力 pyautogui.write('hogehoge') #保存ショートカットキー実行 pyautogui.hotkey('ctrl','s') #保存ボタンを押下 while pyautogui.locateOnScreen('resister.png', confidence=0.9) is None: time.sleep(1) pos = pyautogui.locateOnScreen('resister.png', confidence=0.9) pyautogui.click(pos)
ここで、認識させた画像ですが、
vscode上で新しいファイルを生成するためのこちらの画像と、
※画像ファイル名:vscode.png
保存時に保存ボタンをクリックするためのこちらの画像を用いました。
※画像ファイル名:resister.png
どちらもwindowの開く位置に応じて座標がズレるため、画像により座標の位置を取得しています。
画像の座標位置の取得ですがこちらのコードでそれぞれ取得しています。
while pyautogui.locateOnScreen('画像ファイル名', confidence=0.9) is None: time.sleep(1) pos = pyautogui.locateOnScreen('画像ファイル名, confidence=0.9)
まず、
while pyautogui.locateOnScreen('画像ファイル名', confidence=0.9) is None: time.sleep(1)
で画面上に画像が含まれているかをチェックし、見つかるまで1秒間隔でループします。
画像の部分が見つかり次第、
pos = pyautogui.locateOnScreen('画像ファイル名, confidence=0.9)
にてposに画像の位置を代入します。
ここで、confidenceは画像との一致率を示しています。
confidenceを1に近づけると完全一致に近づきます。
1を指定してしまうとディスプレイに画像領域が存在しても反応してくれないことが多々発生します。
体感で、0.8~0.9の間にするとよさそう。
こちらは、使用環境によりばらつくところになるのでチューニングしてみて下さい。
後は前回のブログで書いた通り、キーボード操作を駆使して自動操作を行っています(前回と重複するので細かい解説は省略します)
※前回のブログは下記です。
elsammit-beginnerblg.hatenablog.com
こちらのコードを実行してみてください。
恐らく、エディタの立ち上げから新規ファイルが開き、hogehogeという文字が入力されたファイルが保存されるかと思います。
■画像認識を用いてディスプレイ上の操作が正しいかチェック
locateOnScreenによる画像認識は自動操作と合わせて正しい画像が出ているかチェックできそうだな。
と感じております。
画像認識のみを実行したクイズ形式のコードを載せます。
import pyautogui import time print("Question1") while pyautogui.locateOnScreen('vscode.png', confidence=0.9) is None: time.sleep(1) print("Q1 NG") print("Q1 OK") print("=============================") print("Question2") while pyautogui.locateOnScreen('newPage.png', confidence=0.9) is None: time.sleep(1) print("Q2 NG") print("Q2 OK") print("=============================") print("Question3") while pyautogui.locateOnScreen('resister.png', confidence=0.9) is None: time.sleep(1) print("Q3 NG") print("Q3 OK")
こちらのコードは先ほどのvs codeを開いて新しいファイルを作成するまでの手順をクイズ形式に並べたコードになります。
Question1では、vs codeが正しく開けたかを先ほどのvscode.pngを用いてチェック。
Question2では、vs code上で新しいファイルが開けたかをチェック。
最後にQuestion3では、保存を行うための画面が開けているかを、
resister.pngでチェックしています。
こちらのような画像認識していくコード結構有用だと思っているんですよね。
なぜか??
GUI画面の遷移確認が比較的簡単に自動化できそうなんですよね。
内部的な制御であれば、分岐処理が正しく通っているかをinとoutをチェックしていくことがメインになるので自動化コードは簡単なのですが、
GUIだと正しい画面が表示されているか確認が必要ですね。
このGUI画面の確認の一部を肩代わりできるかな?と考えています。
例えば、
画面Aの次には画面Bが表示され、さらに次は画面C、、
と続く場合、画面B、画面Cの特徴的な部分を切り出して、
実際に自動的に画面遷移を実施しながら切り出した画像に対して、
locateOnScreenを実行していけば成否判断出来てしまいますよね。
もちろん、最後は人間の目で見て確認は必須となりますが、
コード修正の過程ではこちらの自動化を用いるなどすることで負荷は軽減できそうです。
■注意点?
自分の環境ではデュアルモニタを用いているのですが、メインモニタでのみ反応していました。
セカンドモニタでは反応しない?
もう少し調べる必要がありそう。
■最後に
今回は画像認識で操作を自動化するためのサンプルをご紹介しました。
こちらも結構便利なので折を見て使用していくかと思います。
とりあえず、画像認識だけでも評価に使用できそうなので導入してみようかな?
Pythonでマウス操作自動化
先日Pythonでキーボード操作自動化の方法をまとめてみました。
elsammit-beginnerblg.hatenablog.com
今回はマウス操作自動化方法についてまとめていきたいと思います。
■環境構築
先日のキーボード自動化と同様に、
PyAutoGUI
を用います。
PyAutoGUIは下記でインストールできます。
pip install pyautogui
■マウス操作自動化
では実際にマウス操作を自動化していきます。
簡単な例としてこちらのコードを掲載します。
import pyautogui import time time.sleep(3) pyautogui.dragTo(500, 500, button='left',duration=0.5) pyautogui.dragTo(700, 200, button='left',duration=0.5) pyautogui.dragTo(200, 200, button='left',duration=0.5)
ペイントを開き、
プログラム実行後、ペイントにマウスカーソルをセットすると
セットした位置から
(500,500)→(700,200)→(200,200)
で線が引かれていくかと思います。
例えば、こちらを実行するとこちらのような絵が描けます。
座標は絶対値指定ですので、初期座標によって進む方向が異なります。
durationはマウスを動かす速度、
buttonはマウスクリックの向き?を示しています。
今回leftで0.5を指定しましたので、
左クリックした状態で0.5秒の速度で指定した座標で動作させております。
マウスをクリックさせながら動作させるAPIとして、
pyautogui.drag
があります。
公式が公開しているコードになるのですが、
import pyautogui distance = 200 while distance > 0: pyautogui.drag(distance, 0, duration=0.1) distance -= 5 pyautogui.drag(0, distance, duration=0.1) pyautogui.drag(-distance, 0, duration=0.1) distance -= 5 pyautogui.drag(0, -distance, duration=0.1)
を実行し、ペイント上で線を引くとこちらのようにぐるぐると線を書くことが出来ます。
※参考:https://pyautogui.readthedocs.io/en/latest/mouse.html
pyautogui.dragは指定した位置から相対位置で線を引く形になります。
■その他のAPIに関して
オーソドックスな操作である、クリックやマウス操作のAPIも存在します。
pyautogui.click()
は単純な左クリックを実行するAPIです。
右クリックを行いたい場合には、
pyautogui.click(button='right')
を用います。
ダブルクリックの場合には、
pyautogui.click(clicks=2)
とするかもしくは、
pyautogui.doubleClick()
とすればOK。
マウス移動に関しては、
pyautogui.moveTo(X座標, Y座標)
と
pyautogui.move(X座標, Y座標)
で実現できます。
先ほどのdragと同様に、
moveTo関数の場合には絶対位置指定、
move関数の場合には相対位置指定になります。
さらに、moveTo、move関数では第3引数に数値を与えることでdurationのように移動する速度を制限することが出来ます。
例えば、
pyautogui.moveTo(100, 100,1)
とすれば、1秒で(100,100)の位置へ、マウスを移動させることが出来ます。
■マウスの位置を調べる方法
こちらも公式に掲載されていたのですが、マウスの位置を調べるコードを載せておきます。
def checkMouseCoursol(): while True: x, y = pyautogui.position() positionStr = 'X: ' + str(x).rjust(3) + ' Y: ' + str(y).rjust(3) print(positionStr, end='') print('\b' * len(positionStr), end='', flush=True)
※参考:https://pyautogui.readthedocs.io/en/latest/mouse.html
こちらのコードを実行すると、マウスの位置がコンソール上に表示されます。
画面上のどこにマウスを操作しているのかあらかじめ調べる際に便利なコードですので載せておきました。
■最後に
今回は前回に引き続きマウス操作の自動化をまとめてみました。
自分はまだマウス操作の自動化は使い道がないのですが、使いたいと思った時にこちらのブログを読み返してみたいと思います。
Pythonでキーボード操作自動化
最近同じような操作しているな、と思ってきました。
ちょっとこの操作を自動化出来ないかな?と思い立ち調べてみたところ、
Pythonでキーボードやマウスを自動で入力する方法を発見!!
流石Python!!
ということで、今回はPythonを利用してキーボードを自動入力する方法を備忘録としてまとめようと思います。
■環境準備
ではまずは環境を構築していきます。
用いるPythonのバージョンですが、
Python 3.7.4
です。
キーボードやマウスを自動で操作するにあたり、
PyAutoGUI
を用います。
【PyAutoGUIとは?】
Pythonスクリプトでマウスとキーボードを制御して、他のアプリケーションとの対話を自動化できます。APIはシンプルになるように設計されています。
PyAutoGUIは、Windows、macOS、およびLinuxで動作し、Python2および3で動作します。
PyAutoGUIにはいくつかの機能があります。
・マウスを動かして、他のアプリケーションのウィンドウをクリックします。
・キーストロークをアプリケーションに送信する(たとえば、フォームに入力するため)。
・スクリーンショットを撮り、画像(ボタンやチェックボックスなど)を与えて、画面上で見つけます。
・アプリケーションのウィンドウを見つけて、移動、サイズ変更、最大化、最小化、または閉じます(現在、Windowsのみ)。
・アラートボックスとメッセージボックスを表示します。
※参考:https://pyautogui.readthedocs.io/en/latest/keyboard.html
ではPyAutoGUIをインストールします。
インストール方法はこちら。
pip install pyautogui
これで環境構築は完了です。
■キーボード入力自動化
では、キーボード入力を自動化していきます。
今回実施する内容ですが、
メモ帳を開き、
Hello World
Hello PyAutoGUI
good by
と入力することを自動化していきます。
コードはこちら。
import pyautogui import time def testKey(): pyautogui.press('win') pyautogui.write('notepad') time.sleep(1) pyautogui.press('enter') time.sleep(1) pyautogui.write('Hello World', interval=0.1) pyautogui.press('enter') pyautogui.write('Hello pyautogui', interval=0.1) pyautogui.press('enter') pyautogui.write('good by', interval=0.1) pyautogui.press('enter') pyautogui.alert('Finish.') testKey()
では解説していきます。
まず、
pyautogui.press関数は引数で与えられたキーボード上のボタンを押下する処理が実行され、
pyautogui.write関数では、write関数に与えられた引数の文字列を入力する処理が実行されます。
このため、
pyautogui.press('win')
だとwindowsボタンが押下され、
pyautogui.write('notepad') time.sleep(1) pyautogui.press('enter')
にてwindowsボタンで表示される検索画面にnotepadが入力され、
enterキー押下によりメモ帳が開きます。
その後、
pyautogui.write('Hello World', interval=0.1) pyautogui.press('enter') pyautogui.write('Hello PyAutoGUI', interval=0.1) pyautogui.press('enter') pyautogui.write('good by', interval=0.1) pyautogui.press('enter')
にて、
Hello World
Hello PyAutoGUI
good by
を入力していきます。
ここで、pyautogui.write関数のintervalですが、入力の速度を意味しています。
今回は0.1秒ごとに一文字ずつ入力するコードにしています。
最後に、
pyautogui.alert('Finish')
にて完了したことをポップアップのメッセージとして表示します。
■その他のキーボード自動入力コマンド
pyautogui.write関数やpyautogui.press関数以外にも、
キーボードを入力した状態にする
pyautogui.keyDown
キーボードを話した状態にする、
pyautogui.keyUp
があります。
例えば、
pyautogui.keyDown('ctrl') pyautogui.press('v')
を実行するとペースト作業が実行できます。
また、ショートカットを実行するのであれば、
pyautogui.hotkey('ctrl', 'v')
が利用できます。
また連続でキーボードを入力する場合には、
pyautogui.press(['left', 'left', 'left'])
といったように配列で記載することも出来ます。
こちらのコードでも連続で入力することが可能です。
pyautogui.press('left', presses=3)
■対応キーボード文字名
公式に対応(使用)出来るキーボードのキー名が掲載されていたので転記しておきます。
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']
※参考:https://pyautogui.readthedocs.io/en/latest/keyboard.html
■最後に
今回はPyAutoGUIを用いてキーボードの入力を自動化する方法についてまとめました。
次回はマウスの自動操作についてまとめたいと思います!!
キーボードが自動入力できるのは使いかたによっては便利ですね!!
アプリやツールにAPIが搭載されておらず、どうしてもマウス+キーボードでしか操作出来ない場合でも自動化できますし。
PyAutoGUI公式HPのFAQに書いてあったのですが、キーボードやマウスロガーはないようです。
こちらは自前で用意するしかなさそうですね。
ロガーについても方法調べたり、検討してみようかな?
PythonでExcel操作 シート追加と削除についてまとめてみる
先日、データをPythonを用いてexcel化する方法をまとめました。
elsammit-beginnerblg.hatenablog.com
こちらの方法でexcel化してデータをグラフ化しているのですが、
ちょっとデータの種類が増えてきたことに伴い、シート1枚では管理が難しくなってきました。。
そこで今回は別シートを作成したり、無駄なシートを削除する方法に関してまとめていきたいと思います。
また、後で何のシートなのかが分かるようにシート名を追加する方法も載せておこうと思います。
■環境構築
前回と同様に、pythonのバージョンは、
Python 3.7.3
です。
前回もお話した通り、Python3.x.xであれば使用出来る手順かと思います。
また、今回も例によって用いるライブラリはopenpyxlです。
openpyxlは下記によりインストール可能です。
pip install openpyxl
■Excelシートを追加してみる
ではopenpyxlでExcelシートを追加していきたいと思います。
単純にシートを追加したいだけであれば、
from openpyxl import Workbook wb = Workbook() ws = wb.create_sheet()
でOKです。
実際にシートを作成しているコードは、
ws = wb.create_sheet()
になります。
wb変数は、
wb = Workbook()
により生成したExcel作業データになります。
Excelファイルを開いてシートを追加した感じのコードが上記コードですね。
前回のコードを流用すると、データがこちらとして、
dataX1 = ["index",1,2,3,4,5] dataY1 = [ ["data1",10,5,30,50,80], ["data2",100,5,30,10,100] ] dataX2 = ["index",6,7,8,9,10] dataY2 = [ ["data1",20,15,40,60,90], ["data2",110,15,40,20,110] ]
こちらのようなコードを作成すると、
def DataToXmlFiles(dataX1, dataY1, dataX2, dataY2, outfile): wb = Workbook() ws = wb.active for var in range(len(dataX1)): ws.cell(row=var+1,column=1).value = dataX1[var] for i in range(2): ws.cell(row=var+1, column=i+2).value = float(dataY1[i][var]) ws = wb.create_sheet() for var in range(len(dataX2)): ws.cell(row=var+1,column=1).value = dataX2[var] for i in range(2): ws.cell(row=var+1, column=i+2).value = float(dataY2[i][var]) wb.save(outfile)
1枚目のシートにdataX1、dataY1のペアのデータ
2枚目のシートにdataX2、dataY2のペアのデータ
がそれぞれ書き込まれるかと思います。
シートの位置ですが、create_sheet関数の引数にシートのindex番号を渡せばOKです。
ws = wb.create_sheet(index=シート位置を指定する番号)
※左から0、1、2、、、となります。
■Excelシートを削除してみる
では次にExcelシートを削除してみます。
といってもこちらもシート追加と同様に数行で済みます。
wb = Workbook()
wb.remove_sheet(wb.get_sheet_by_name('シート名'))
実際にシートの削除処理を行っているのは、
wb.remove_sheet(wb.get_sheet_by_name('シート名'))
です。
Excelに含まれているシート名の一覧を見たい場合には、
wb = Workbook() wb.sheetnames
でOKです。
sheetnamesによりリスト型でシート名が返ってきますので、
削除したいシート名を検索して、
remove_sheet関数で削除を実行すればOKです。
■シートに名前を付ける
シートの追加と削除が行えるようになりました。
シートを管理するにあたりシート名があった方が管理しやすいかと思います。
シート名を追加するコードはこちらになります。
ws.title = "シート名"
wsは現在使用・選択しているシートになっておりますので、
現在使用しているシートにシート名を付与しています。
使用するシートを切り替える方法は、
ws = wb.worksheets[ シート番号 ]
で切り替えが可能です。
ここでシート番号は左から0、1、2、、、、
となります。
例えば、シートの2番目をhogeという名前にしたい場合には、
ws = wb.worksheets[1] ws.title = "hoge"
とすればOKです。
■最後に
今回はopenpyxlでシートの管理を行ってみました。
Excel化は結構便利なので、これからも使っていきたいと思います。
また気づいたことなどあったらまとめていきたいと思いますので、よろしくお願いいたします。
PythonでgRPCを試してみる
今回はPythonでgRPCを試してみたので備忘録をまとめておこうと思います!!
ちょっとgRPCを使うことになったのですが、少し理解できなかったところもあったので試しに動かしてみた感じです。
■gRPCとは?
gRPCはクライアントアプリケーション内のローカルオブジェクトであるかのように、
別マシンに存在するサーバーアプリケーションのメソッドを直接呼び出すことが出来る仕組みになります。
gRPCを用いることで分散アプリケーションやサービスを容易に作成することが可能になります。
サーバー側ではインターフェースを実装し、gRPCサーバーを実行してクライアントの呼び出しに対して処理を行います。
クライアント側ではサーバーと同じメソッドを提供するスタブがあります。
gRPCではサーバー、クラアイント側にて様々な環境で実行及び通信が行えます。
例えば、C++言語でサーバーを作成しクライアント側でJavaやPythonを作成して通信することが可能になります。
■PythonでgRPCを使うための環境構築
ではまずは環境構築を行っていきます。
gRPCを使用するにあたり下記コマンドを実行します。
pip3 install grpcio or python3 -m pip install grpcio
次に、
pip3 install grpcio-tools or python3 -m pip install grpcio-tools
でgrpcio-toolsをインストールします。
grpcio-toolsは.protoファイルを扱うのに用います。
■gRPCサービス定義していく
ではまず、双方向通信を行うためのサービスの作成を行います。
helloworld.protoの名前でこちらのコードを作成します。
syntax = "proto3"; package sample; message HelloMessage{ string name = 1; string msg = 2; } message ReplyMessage{ string reply_msg = 1; } service SampleService{ rpc SayHello (HelloRequest) returns (HelloReply) {} }
こちらですが、
message HelloMessage{ string name = 1; string msg = 2; }
や
message ReplyMessage{ string reply_msg = 1; }
がサーバーとクライアント間で通信するためのメッセージ用のメソッドになります。
本コードにより、sayHelloメソッドでクライアントからHelloRequestを受け取り、サーバーからHelloReplyを返すサービスが生成されます。
ではこちらのコードからprotocol bufferに変換するために下記を実行します。
python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./helloworld.proto
本コードを実行することにより、
・helloworld_pb2.py
・helloworld_pb2_grpc.py
が生成されるかと思います。
■サーバーサイド実装
ではサーバーサイド側を実装していきます。
import grpc import helloworld_pb2 import helloworld_pb2_grpc class Greeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve()
まず、
class Greeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
でクライアントから受け取るメソッドを実装します。
その後、
def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
でメソッドを登録し、
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
で50051ポートでサーバーを起動しクライアントからのリクエストを待ちます。
■クライアントサイド実装
次にクライアントサイドを実装していきます。
コードはこちら。
import grpc import helloworld_pb2 import helloworld_pb2_grpc def run(): with grpc.insecure_channel('localhost:50051') as channel: stub = helloworld_pb2_grpc.GreeterStub(channel) response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) print("Greeter client received: " + response.message) if __name__ == '__main__': run()
サーバー側と結構似ていますね。
with grpc.insecure_channel('localhost:50051') as channel:
にて通信を確立し、
stub = helloworld_pb2_grpc.GreeterStub(channel)
でスタブを作成し、生成したスタブからサーバー側へリクエストとしてSayHelloメソッドを送信します。
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
■実際に動かしてみる
では、実際に動かしてみます。
サーバー側を、
python3 サーバーファイル名.py
と実行した後に、
クライアント側を、
python3 クライアントファイル名.py
と実行するとクライアント側で
Greeter client received: Hello, you!
と出力されるかと思います。
■最後に
今回はPythonでgRPCの基礎に関してまとめてみました。
gRPCは大きなシステムになった時にモジュール間で接続するのに役立ちそうだな。
ちょっと使っていこうかな!!
後、このブログを書いてる途中で普段使いのラズパイ3が故障した。。。
これから修理に入ります泣。
webブラウザ上にjetsonのデスクトップ画面を表示・操作してみる
今回はjetsonのデスクトップ画面をwebブラウザに表示させるための環境構築について備忘録としてまとめておこうと思います!!
ちょっと環境構築にハマってしまった点があったので。。
■環境
今回はjetson nanoを用いて環境構築を試みました。
ただ、Linux環境であれば適用できるかと思います。
■準備
webブラウザ上にデスクトップ画面を表示・操作するにあたり、
・VNC Server
・noVNC
を用いていきます。
【vncとは?】
Virtual Network Computingの略で、簡単にまとめると
PCを遠隔操作したい時に使用するツールのことです。
詳しくはこちらにまとめられておりますのでご参照ください。
https://wa3.i-3-i.info/word13373.html
余談ですが、こちらのサイト結構分かりやすく用語がまとめられておりかなりおすすめです。
初心者でも分かりやすくかみ砕いて説明されております!!
では、
・VNC Server
・noVNC
をインストールしていきます。
これらのツールはサーバー側(アクセス対象)にインストールします。
※今回の場合はjetsonですね。
まずはVNC Serverからです。
コマンドはこちらになります。
sudo apt install tightvncserver
インストール後、サーバーに遠隔でログインするためのパスワードを設定していきます。
パスワードを設定する手順ですが、
vncpasswd
を入力すると、
Password: Verify:
と聞かれるので2回とも同じパスワードを入力します。
その後、
Would you like to enter a view-only password (y/n)?
と聞かれるので、閲覧のみのログインパスワードも設定したい場合にはyを選択。
すると先ほどと同様に、
Password: Verify:
と聞かれるので2回とも同じパスワードを入力します。
こちらをインストールすれば、遠隔操作したいPCにVNC Viewerというツールがインストールすることにより、
遠隔操作が可能になります。
簡単に手順をまとめますと、
x0vncserver -display :0 -passwordfile ~/.vnc/passwd
をサーバー側で入力します。
その後VNC Viewer側でサーバーのIPアドレスを入力し、
先ほど設定したパスワードを入力すれば遠隔操作がおこなえるかと思います。
今回はWebブラウザ経由で遠隔操作してみたいので先に進めます。
次にnoVNCです。
インストールはこちらでOK。
sudo apt install novnc websockify
websockifyですが、noVNCのサービスを起動するために用います。
これで準備完了です。
■Webブラウザ上で遠隔操作を行ってみる
では実際に遠隔操作するための準備を行ってみます。
まず、
x0vncserver -display :0 -passwordfile ~/.vnc/passwd
でVNC Serverを起動させます。
そして、"VNC Serverを起動"させた状態で、
websockify --web=/usr/share/novnc 6080 localhost:5900
を実行してください。
ここで、
localhost:5900
はVNC Serverを起動させた際のポート番号に合わせてください。
※恐らく5900だと思うのですが、VNC Server起動時のログに出力されますので確認しておくこと
では実際にWebブラウザ上で下記を入力ください。
http://IPアドレス:6080/vnc.html?host=IPアドレス&port=6080
するとこちらのような画面が表示されます。
vncpasswdで設定したパスワードを入力すると遠隔操作対象のPCの画面が表示されかつ遠隔操作が行えるようになるかと思います。
これで、Webブラウザでデスクトップ画面の操作が行えるようになります。
自分は下記理由により数時間時間をつぶしてしまいました。。
次回からは躓かないようにしたいです。
・VNC Serverを起動していなかったのでアクセスできなかった
・ポート番号をVNC Serverと合わせていなかった
■最後に
ネットワーク系が弱くてよく躓く。。
ちゃんと基礎から勉強しないと!!