Python
Haxe

Haxe3.2でPython出力を試す

More than 3 years have passed since last update.

Haxe 3.2からPython出力が可能になったので、試してみます。

インストール

Haxe 3.2のインストール

Haxe公式のDownloadsから最新版をダウンロードしてインストールします。

Macでhomebrewを使っているなら下記でもOKです。

$ brew install haxe --HEAD

もしくは、Building Haxeを参考に自分でビルドします。

Python3.xのインストール

他にたくさん記事があるので省略。
なお、いまのところHaxeが出力可能なのはPython3だけのようです。

Haxe/Pythonチュートリアル

Hello World

公式のHello WorldでPython出力をしてみます。

まずはHelloWorld.hxを下記の内容で作成。

HelloWorld.hx
class HelloWorld {
    static public function main() {
        trace("Hello World");
    }
}

上記をhaxeでhelloworld.pyにコンパイル。

$ haxe -main HelloWorld -python helloworld.py

-mainオプションがメインクラス、-pythonオプションがPython指定で出力するファイル名です。詳細はCompiler Usage参照。

もしくは、下記のようにcompile.hxmlを作成しコンパイルする方法もあります。

compile.hxml
-python helloworld.py
-main HelloWorld
$ haxe comple.hxml
# 上記の haxe -main HelloWorld -python helloworld.py と同じようにhelloworld.pyが出力される

コンパイルが成功したら、出力されたhelloworld.pyを実行します。

$ python3 helloworld.py
Hello World

無事、Hello Worldが出力されました。

なお、このとき出力されているhelloworld.pyは下記のようになっていました。

helloworld.py
class HelloWorld:

    @staticmethod
    def main():
        print("Hello World")



HelloWorld.main()

コマンドライン引数の取得

Sys.argsからコマンドライン引数が取得できます。

Main.hx
class Main {
  static public function main():Void {
    var args = Sys.args();
    for (arg in args) {
      Sys.println(arg);
    }
  }
}

コマンドライン引数のリストをSys.printlnで出力します。

$ haxe -main Main -python main.py
$ python3 main.py foo
foo
$ python3 main.py foo bar
foo
bar

このとき出力されたmain.pyは378行ありました。(長い!)
おそらく、Sysを使用するようになったためで、若干余分なものも含まれています。
とはいえ出力されたPythonを読んでみるのもおもしろいでしょう。

ファイル出力

sys.io.Fileでファイル出力をしてみます

Main.hx
import sys.io.File;

class Main {
  static public function main():Void {
    var output = File.write("output.txt");
    output.writeString("test\n");
    output.close();
  }
}
$ haxe -main Main -python main.py
$ python3 main.py
$ cat output.txt
test

ファイル出力をcodecsで行う場合

ファイル出力にpython.lib.Codecsを使用すると、Pythonのcodecs相当になります。

Main.hx
import python.lib.Codecs;

class Main {
  static public function main():Void {
    var file = Codecs.open("output.txt", "w");
    file.write("test\n");
  }
}
$ haxe -main Main -python main.py
$ python3 main.py
$ cat output.txt
test

長いのでここには書きませんが、実際に出力された main.pyを読んでみると、codecs.open を使用していることがわかります。

当然ながら、python.lib.Codecs はPython出力時にしか使用できませんので、注意が必要です。
sys.io.FileはC++, PHP, nekoなどの他のプラットフォーム向けコンパイルも可能)

Haxe/Pythonでライブラリを使用する

Pythonの標準ライブラリを呼び出す

上記 codecs を利用する場合のように、Pythonの標準ライブラリのいくつかはそのまま利用可能です。
Issue#2924より、現時点ではsys.netの一部とsys.dbの全ては未実装(いずれ実装予定)のようです。利用可能なものはpython.lib パッケージで確認できます。

Haxeのライブラリを使用してPython出力する

HtmlParserというHaxe実装のHTMLパーサライブラリがあります。(たぶんpureな)Haxe実装なので、Haxeが対応しているプラットフォームならいずれにも出力することが出来るはずです。そう、もちろんPythonにも!

というわけでHaxeのライブラリをインストールして利用してみます。

$ haxelib install HtmlParser
Main.hx
import sys.io.File;

import htmlparser.HtmlDocument;

class Main {
  static public function main():Void {
    var html = new HtmlDocument(File.getContent("example.html"));
    var titles = html.find(">html>head>title");
    trace(titles[0].innerHTML);
  }
}

ライブラリ使用時はコンパイル時に-libオプションで使用するライブラリを指定します。

$ haxe -main Main -python main.py -lib HtmlParser
example.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Title of Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>
$ python3 main.py
Title of Example

HTMLをパースして、タイトルを取得できていることがわかります。

つまり、(pureな)Haxe実装のライブラリであればPython向けに利用することもできるし、その他のプラットフォームにも同じライブラリを利用することが出来ます。すごいね!
(もちろん、HTMLパーサぐらいは既にPythonで優秀なライブラリがいくつもありますが…)

課題とか

  • Pythonの外部ライブラリを使用したいときはどうするの?(externして@:pythonImport?externがめんどくさそう…)