技術メモ

プログラミングとか電子工作とか

Elixirで外部コマンドの実行

f:id:ysmn_deus:20190122112104p:plain

どうも、靖宗です。
いつもはシリーズ物ばかり書いてますがたまには単発記事も書きたいです。
技術”メモ”なので、好きに書けばええやんって言われそうですが(笑)

プログラムの醍醐味は普段の作業を効率化、自動化してくれるところだと思ってます。
そういう意味では「外部コマンドの実行」は自分のよく触るPythonでもよく行います。
そこで一応Elixirの外部コマンドを実行する手立てを調べておきます。

Systemモジュール

どうやらElixirでは外部コマンドを実行するときにはSystemモジュールを利用するそうです。

hexdocs.pm

また、Qiitaのこの記事も参考にさせていただきました。

qiita.com

どうやら「そもそもコマンドが存在するか否か」を判定する関数と、「コマンドを実行する関数」があるそうです。
(Systemモジュールはその他の機能もたくさんあります)

find_executable("コマンド")

find_executable/1でまずはコマンドが存在しているかどうか確認します。
試しにpythonが実行できるか確認します。

iex(1)> System.find_executable("python")
"c:/Python/Python36/python.exe"

パスが返ってきました、問題無いようです。
逆に実行不可の時は?

iex(2)> System.find_executable("pithon")
nil

nilになりました。なんとなくElixirなら成功の時も{:ok, result}とか{:error, nil}とかになりそうな気はしますが、こんなもんでしょう。

cmd("コマンド", 引数, オプション)

コマンドは上記で確認したコマンドなど、引数はコマンドに引数が必要でない場合も空リストを渡してあげるようです。オプションに関しては必要無ければ書かなくてもいいようですが、環境変数や実行時にcdしたいときなどには利用しそうです。
とりあえず試します。

iex(3)> System.cmd("python", ["--version"])
{"Python 3.6.1\r\n", 0}

単純な話ではありますが、これらを知ってるだけで色々な事が自動化できると思います。