LoginSignup
20
21

More than 5 years have passed since last update.

【個人メモ】julia - PyCallを利用してPythonのライブラリをjuliaで使う

Last updated at Posted at 2014-05-27

Pythonのライブラリを利用する

相変わらず朝活でドヤ顔でMac Book Pro Retina 13インチを触っている。
今日もjuliaやるか、と思った。
以前、Pythonも使えそうとQiitaの記事に書いた。

【個人メモ】julia製Web Application Framework "Morsel"を試す

試してみるかと思ったので試してみる。
PyCall.jlをつかえばPythonのライブラリを実行できる。

試しに使ってみよう。

PyCall.jlのインストール

JuliaのREPLより、以下のコマンドを実行する

Pkg.add("PyCall")

これでOK

Pythonのライブラリを試しに利用する

PyCall.jlのREADME.mdに書かれている例では
mathライブラリを利用している。

using PyCall
@pyimport math
math.sin(math.pi / 4) - sin(pi / 4)  # returns 0.0

正規表現ライブラリはつかえるだろうか?

とりあえず試す

試してみる。

using PyCall

@pyimport re

match_pattern = re.compile("Welcome to (.+\.)")

groups_of_match = pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]

result = convert(String, pycall(groups_of_match, PyObject, 0))
match_of_group = convert(String, pycall(groups_of_match, PyObject, 1))

println("All match is [$result]")
println("Match of first regex group is [$match_of_group]")

実行結果は以下の通り。

スクリーンショット 2014-05-27 9.37.12.png

このコードは、Pythonでは以下と同等だ。

import re

match_pattern = re.compile("Welcome to (.+\.)")

groups_of_match = match_pattern.search("Welcome to underground.")

result = groups_of_match.group(0)
match_of_group = groups_of_match.group(1)

print("All match is [{result}]".format(result=result))
print("Match of first regex group is [{match_of_group}]".format(
  match_of_group=match_of_group)
)

実行結果

スクリーンショット 2014-05-27 9.45.26.png

利用した関数など

pycall 関数

参考元によると、

pycall(function::PyObject, returntype::Type, args...)

という形式で書くとあるので、正規表現ライブラリの試用には以下のようにした。

pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]

PyObjectは数値型やbool、関数型を返す。便利オブジェクトっぽい。
(説明にはC APIのPyObjectを利用していると書いてある)

pycallを以上のように呼び出すことで、
正規表現にマッチしたグループ及びマッチした文字列全体を利用できる。

match_pattern["search"] は、
PyObjectの説明にある通り、オブジェクトの属性を取得する。この場合は、正規表現マッチオブジェクトの search メソッドを呼び出している。

convert

convertの説明は、PyObjectの説明の中に書かれてる。

convert(T, o::PyObject)

要するに、キャストを行う。
juliaのString型にしたかったので、
正規表現の結果(PyObject)をjuliaのString型にキャストした。

convert(String, pycall(groups_of_match, PyObject, 0))

簡単にPyObject型をString型にキャストできた。

軽く触ってみて

PyCallがあることが、juliaのウリ文句の一つのようだ。
julia自身のライブラリ数はビルトインのものではさほど多くないので、
Pythonのライブラリ資産が利用できるのは良いと思った^ー^

20
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
21