DataSpiderでPythonのスクリプトを実行してみた

# はじめに
こんにちは。すぎもんです。😀
DataSpider ServistaからPythonで作成されたプログラムの起動をやってみました。

例えばAWSの画像認識サービスである「Amazon Rekognition」と連携する際に用いるAWS コマンドラインインターフェイス (AWS CLI) コマンドの起動は、DataSpiderでPythonのスクリプトを起動することが解決手段の一つとなります。

:::note info 
DataspiderとAmazon Rekognition連携のユースケース
顔写真を生体認証情報としてDataspider経由でAmazon Rekognitionへ登録し、施設入退館時に監視カメラの顔画像と照合し本人確認する。
:::

:::note warn
その他Pytonスクリプトの実行により解決可能な処理の代表的なものは下記になります。
* 指定した桁数でのランダムの文字列生成
* SHA256等ハッシュ値を用いてのファイル暗号化
:::

本記事ではDataSpiderからPythonスクリプトを起動する方法を紹介します。

# 今回やること

Dataspiderで以下2通りのPythonスクリプト実行手順を検証します。

**①バッチファイルからの実行**
**②PythonスクリプトをEXE化して実行**

# 実行準備
### 1.Pyton実行環境構築
:::note info 
Pythonスクリプトを開発、実行するためにはPythonをインストールする必要があります。
WindowsでのPythonインストール方法は下記ページ等を参照して下さい。
:::
　[Windows版Pythonのインストール](https://www.python.jp/install/windows/install.html)

### 2.Pythonスクリプト準備
:::note info 
今回用意したPythonスクリプトの処理内容はアルファベットの大文字小文字と数字の組み合わせでランダムな12桁の文字列を生成し、標準出力するというものです。
:::
```generate_user_id.py
###import os
import base64
import time
import hashlib
import json
import os
import random
import secrets
import string
import sys
from base64 import b64encode

sys.stdout.write(''.join(random.choices(string.ascii_letters + string.digits, k=12)))
```
# 検証手順
## ①バッチファイルからの実行
1.Pythonスクリプト起動用のバッチファイルを作成します。
```generate_user_id.bat
@echo off
python C:\script\generate_user_id.py
```
:::note info 
　Pyhonスクリプトに引き渡すパラメータがある場合は下記のように指定してください。
:::

```image_encryption.bat
@echo off
python image_encryption.py #1
```


2．「外部アプリケーション起動処理」アイコンで「必須設定」タグの「起動コマンド」欄で「generate_user_id.bat」を指定します

:::note warn
起動コマンドは「/C:/script/generate_user_id.bat」のようにフルパスで指定してください。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/083012e0-454e-26d3-97d3-8478ef55a056.png)

:::note info 
　バッチファイルに引き渡すパラメータがある場合は「起動引数」欄へ設定が必要です。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/540efdb2-16a4-0abc-2360-ab23bced18ee.png)


2．「実行設定」タグで以下を設定します。
* 作業ディレクトリ欄=バッチファイルが配置されているフォルダを入力
* 「外部アプリケーションが終了するまで待つ」とその配下に「チェック」を入れる
:::note warn
「外部アプリケーションが終了するまで待つ」と「標準出力・標準エラー出力を取得する」へのチェックは結果を取得し、変数に格納することや後続の処理へ結果を引き渡す場合に不可欠です。チェックを外すと最新の出力結果の返却を待たずに後続処理へ遷移してしまいます。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4ff8a88d-d29d-3145-9445-141b2918a962.png)

:::note warn
**注意**
* 実行環境にPythonがインストールされていないと実行できません
* バッチファイル、Pyrhonスクリプトは容易に変更可能なためファイルのアクセス権限設定等ご留意ください。
* 環境変数設定に注意してください
 特定ユーザの環境変数でPythonのパスを指定していて、DataSpiderServer のプロセスを起動しているユーザが別であればDataSpiderのプロセスを起動しているユーザへのPythonのパス指定が必要となります
:::
## ②PythonスクリプトをEXE化して実行

**exe化することで実行にはPython環境が必要無くなるため、PythonをインストールしていないWindows環境への配布に適している形式です**

1.Pyinstaller等を用いてPythonスクリプトをexe化します。

:::note info 
　exe化の詳しい手順は下記リンク先をご参照ください。
　[PyinstallerでPythonプログラムをexe化する手順書（Windows編）](https://qiita.com/nal_dal_dere/items/95e173068af399e61981)
:::
2．「外部アプリケーション起動処理」アイコンで「必須設定」タグの「起動コマンド」欄で「generate_user_id.exe」を指定します

:::note warn
起動コマンドは「/C:/script/generate_user_id.exe」のようにフルパスで指定してください。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1509f490-186b-7030-614e-6b322f8cc1d6.png)

:::note info 
　exeに引き渡すパラメータがある場合は「起動引数」へ欄設定が必要です。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/18753c19-83ca-05e5-a910-8c1f0df2158f.png)


2．「実行設定」タグで以下を設定します。
* 作業ディレクトリ欄=exeが配置されているフォルダを入力
* 「外部アプリケーションが終了するまで待つ」とその配下に「チェック」を入れる
:::note warn
「外部アプリケーションが終了するまで待つ」と「標準出力・標準エラー出力を取得する」へのチェックは結果を取得し、変数に格納することや後続の処理へ結果を引き渡す場合に不可欠です。チェックを外すと最新の出力結果の返却を待たずに後続処理へ遷移してしまいます。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4ff8a88d-d29d-3145-9445-141b2918a962.png)

:::note warn
**注意**
* Pythonライブラリを全てパッケージ化してしまうため、exeファイルのサイズが巨大化してしまう可能性があります。
* exe化することでパフォーマンスはWindows環境への依存度が高くなります。そのためDataSpiderサービス再起動後の初回実行時はWindowsのキャッシュはPythonスクリプトをそのまま実行するよりもパフォーマンスが低下する可能性があります。
    ※Pytonスクリプトでの実行結果が5秒前後だった処理がexe化することで初回10秒、2回目以降5秒前後で安定という事象が発生しました。
:::

# DataspiderでのPythonスクリプト実行手順の選択について

**①Pythonスクリプトをバッチファイルからの実行**
→DataSpiderサーバにPythonがインストールできる場合は、パフォーマンスや開発容易性から同実装方法を推奨致します。

**②PythonスクリプトをEXE化して実行**
→Python開発環境とDataSpider環境が分離されている場合やDataSpiderサーバにPythonをインストールできない場合に選択してください。

# おわりに
いかがだったでしょうか。
当ブログがDataSpiderでPythonが得意するAWSの画像認識サービスであるAmazon Rekognitionとの連携や連携先サービスの仕様に合わせた暗号鍵を開発する等の実現方法の一助になれば幸いです。 

ここまで読んでいただきありがとうございました。それでは、また！