Elixirでpythonを実行

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは
ついに2年目になってしまったs-tomoです

さて今回はElixirでpythonを実行するお話です。

Elixir

Elixir

広告の配信処理にErlangを使うという話を聞いたことがあるような気がするのですが、高負荷なサーバをErlangで書くというのはナイスなチョイスだと思います。

小生は、Erlangを使ったことがないのでわからないのですが、 Erlangは文法に癖があるらしいので、取っ付き難いらしいですね。

端的にいうと、そのErlangをruby風に書くことが出来るのが、Elixirです。
rubyっぽく書けるならやるしかないじゃないってことでElixirを触ってみようと思いました。

Elixirのインストール

Macの人はbrewで、windowsの人はElixirのサイトからインストーラーをダウンロードすればOKです。

Elixirの文法

pathが通っているなら、iexコマンドで対話モードで実行できます。

基本はrubyと同じらしいです。と言っても、スクリプト言語を知っていたらほぼ詰まることはないでしょう。
ですので、ここでは省略させてもらいます。

ただ、小生はrubyを使ったことがなかったので、

greek = [hello: :world]

これの意味が初めわかりませんでした。

文字列の前にコロンを置いたものはシンボルと呼びます。
シンボルはimmutableな文字列リテラルになります。
慣れると使い勝手はよく感じました。

Elixirでpython

[序]

さてさて、Erlangをスクリプト言語感覚で書けるようになったのですが、もちろんサーバサイドで使うには最低でも行列計算が出来ないと話になりません。

実装しろと言われれば頑張りますが、手っ取り早くnumpy使いたい>w<

ということでElixirからpythonコードを呼び出すようにしましょう。

そのために、Erlport を使います。
これはErlangからpythonやrubyを実行するためのライブラリです。(自分で作るのはちょっとね)

[elixir側準備 ]

それでは、まずElixirのプロジェクトを作ります

mix new <project name>

好きな場所に、好きな名前で作成して下さい。

雛形が作成されるので、

cd <project name>

project rootへ移動し、mix.exsを以下のように編集します。

29 defp deps do
30 [{:erlport, github: "hdima/erlport"}]
31 end

今回はhdima/erlportを見に行っていますが、ココは各自の環境に合わせて変更して下さい。

mix deps.get
mix compile

を実行します。deps.getをしておかないとcompile時にライブラリがないと怒られます。

[python側準備]

erlportモジュールが必要になります。

pip install erlport

でインストール出来ます。
ただし、python3はエラーを吐きます。

deps\erlport\privにpython、ruby用のモジュールがあるのでここから直接インストールして下さい。
その時まず、python2の中身をインストールしてから、python3の中身を上書きして下さい。
そうしないと erlport.cli がないと怒られることになります。

[Elixirからpython]

それでは適当にpythonのスクリプトを組んで下さい。
以下の様な感じで、libディレクトリの下に pythontest.pyという名前で置きました。

import numpy as np

def run():
a = np.random.rand(10)
b = np.random.rand(10)
c = np.dot(a, b)
return float(c)

今回は、Elixirの対話モードで試します。

iex -S mix

オプションを付けて対話モードを起動します。このオプションを付けておくと、プロジェクトのファイルを読み込むことが出来ます。

以下の通りに実行して下さい。

> {:ok, pf} = :python.open([:python_path 'lib'])
{:ok, #PID}
> res = :python.call(pf, :pythontest, :run, [])
1.7662253650913642
> :python.stop(pf)
:ok

randomなので数値は毎回変わりますが、ちゃんとpythonコードをElixirから実行できましたね。
めでたしめでたし

簡単に説明をしておきます。

  • stopは特に言うこともないと思います。
  • optn は色々オプションを取れるようで、今回はpython pathの追加をしています。
    [:python, 'python path']を追加すれば、実行するpythonを切り替えることが出来ますが、まあ、それはpyenvとかでやr
  • call(PID, module name, function name, arguments)
    で、pythonの関数を呼び出して返り値を受け取ることが出来ます。
    python側のコードで返り値をfloatしていますが、当然ながらndarrayはElixir側が認識できないので注意して下さい。

まとめ

以上な感じで、Elixir(Erlang)で動くサーバーでpythonの計算スクリプトを走らせることが出来るようになりました。

Elixirをトリガーにpythonスクリプトを実行するのもいいですし、対話的に呼び出すのもいいですが、
pythonで作ったコードをそのまま流用できるのは魅力ですね。

それでは楽しいpython lifeを!!




広告システムについてのお問い合わせやご相談、パッケージ製品の詳細はこちらからどうぞ。
http://admage.jp/
アプリ計測SDK admage for Appのお問い合わせ・詳細はこちら。
http://apptizer.jp/

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

コメントを残す

*