AlteryxのRun Commandツールを使ってPythonを動かす

こんにちは、小澤です。

AlteryxにはRun Commandツールがあり、これを使うことで任意の外部プログラムを実行できます。

このツールはプログラムを実行するだけなので入出力がAlteryxと連携可能にさえなっていれば、 どんな言語で実装されたものかやどんな処理内容なのかといった要素は問われません。 そのため、Alteryxでのワークフロー実装だけでは実現が難しいことや、既に別な方法で実装されている仕組みと組み合わせる際に効果を発揮します。

AlteryxにはRツールやPythonツールなどを使って特定の言語を使ってAlteryx内でプログラムを実装する方法も存在しています。 それらの言語を利用する場合は、用意されているツールを利用するのが最も楽な方法です。 しかし、Run CommandツールであればAlteryxに同梱された環境とは別にインストールした、 RやPythonも利用できるため有効に活用できる場面もあります。

Run Commandツールの動作

さて、最初にRun Commandがどのように動くのかを確認しておきましょう。 Run Commandツールの基本的な動きを構成する設定は以下の3つなります。

  • Write Source
  • Run External Program
  • Read Results

以下はRun Commandツールを使ったシンプルなワークフローです。

Run Commandツールでは

  • 直前のツールから受け取るデータを一度ファイルに書き込む
  • 実行されるプログラムがそれを読み込んで処理を実行する
  • 実行したプログラムが結果をファイルに出力する
  • Alteryxはそのファイルを読み込んでツールの出力として次のツールに渡す

という動きをします。 これらを設定項目と対応させると以下のようになります。

これらの動きからRun Commandツールで実行されるプログラムは以下の動きに対応している必要があります。

  • Alteryxが対応しているフォーマットでデータ読み込みや書き込みが可能
  • Write Sourceで指定したパスのファイルを読み込む
  • Read Resultsで指定したパスにファイルを書き込む

1つ目に関して、対応しているフォーマットは基本的にはInput/Output Dataと同等なります。 そのため、CSVなど汎用的なフォーマットを利用しておけば通常は問題になりません。

2つ目と3つ目に関してはプログラム側でも考慮する必要があります。 ここを固定にしてしまうと、プログラムを他の処理でも使いましたり、パスが変わった際の変更も厄介なものとなります。 そのため、Run External ProgramのCommand Argumentsを利用するなどして、プログラム実行時の引数として渡せるようにしておくなどの工夫が必要となります。

Pythonを実行してみる

実際にPythonで記述された処理を実行する例を見てみましょう。

Pythonの実行自体はPythonツールも利用できますが、他のvenv環境を使いたいなどの理由でRun Comamndツールを使うことが有効な場面が考えられます。 また、Run Commandツールの動きを確認する例としてもいくつかの必要な要素を含みやすいものとなっています。

今回は入力をそのまま出力するだけのシンプルな処理を例とします。

import sys
import time

with open(sys.argv[1]) as rf:
    data = rf.read()

with open(sys.argv[2], 'w') as wf:
    wf.write(data)

これを simple_python.py として保存しています。 AlteryxのRun Commandツールからこのファイルを実行するときにはRun External Programに以下を指定することになります。

  • Command
    • pythonプログラムのパス
  • Command Arguments
    • simple_python.pyのパス
    • 入力ファイルのパス
    • 出力ファイルのパス

これらを指定する際に、パスの指定方法に関して注意点があります。

設定項目に「Browse」というボタンがあるものに関しては特に問題ないでしょう。 Commandにではファイル選択の画面が開くので、インストールされているPythonのファイルを指定します。 以下ではAlteryxに同梱されているPythonを選択した状態となります。

Command Argumentsはコマンドに渡す引数を設定するためのものなので、Browseボタンはありません。 そのため、ここでパスを指定する必要がある場合は手動で記述してやる必要があります。

今回利用する1つ目の引数は実行するプログラムであるsimple_python.pyとなります。 そのため、こちらを指定するのですがファイル名だけを記載するとどこにそのファイルがあるのか不明瞭な状態となってしまいます。

プログラムの場所を記載する方法は2種類あります。

  • 絶対パス( C:\ などのドライブ名から始まるパス)を指定して一意に特定する
  • 現在のフォルダを基準とした相対パス

それぞれ一長一短ありますが、絶対パスで指定する場合、個人のユーザフォルダなど、他の人に渡したときそのままでは動かないパスが含まれる場合もあります。 そのため、そういったケースでは後者を選択するといいでしょう。 その際、基準となるフォルダがどこになっているのかを知っておく必要があります。

Alteryxでは、ワークフローが保存されているパスが相対パスで指定する際の基準位置となります。 これはワークフローの設定において Engine.WorkflowDirectory に記載されているものからも確認可能です。

また、Run Commandツール利用時限定で相対パスの基準位置を変更する設定も可能です。 オプショナルで指定できる「Working Directory」にてフォルダを指定することでそのフォルダを相対パスの基準位置に変更できます。

今回はワークフローと同じフォルダにsimple_python.pyを配置して実行することで、ファイル名のみで実行可能な状態にしています。

残るは入出力のファイルパスとなります。 これらはWrite SourceおよびRead Resultsと同じ値を設定しています。

その際、便利なのが Engine.TempFilePath となります。 これは、その名の通り一時的なファイルを保存しておくためにAlteryxが用意しているものとなります。 Run Commandツールは入出力の際にファイルに保存したデータを読み書きするため、 実行後もそのファイルが残された状態になります。通常、このファイルは他で使うことはありません。 そのため、一時的なファイルとして保存しておくことで、Alteryx終了時に自動的に削除されるようになります。

Run Commandツールからこの一時ファイルを利用するにはパスに %temp% を指定します。

このように指定することで、一時ファイル置き場に write_source.csv というファイルが生成される設定となります。 同様にRun Commandツールからの出力もここを使うようにします。

この入出力をCommand Argumentsにも以下のように設定します。

これらを含めた全体像は以下のようになります。

設定値とワークフローの対応関係は以下のようになります。

これで、Run Commandツールを使って外部のPythonプログラムを実行するワークフローの設定が完了となります。

おわりに

今回は、Run Commandツールを使ってPythonプログラムを呼び出して入出力を処理する方法を解説しました。

Run Commandツールはこの他にもコマンドから呼び出し可能なものであれば実行可能です。 入出力に関してはAlteryxにあわせたかたちでラッパーを用意する必要などが生じることもありますが、既存のプログラムをそのまま活用したいなどの際にはご利用ください。