主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

Boo: コンパイルされたIronPythonモジュールを使うために

                
コンパイルされたIronPythonのクラスをBooで使う。コンパイルされたIronPythonスクリプトは下記のもので、MyClass.pyという名前。
import cPickle

class pickle:
@staticmethod
def dump(obj, filename):
with open(filename, "wb") as f:
cPickle.dump(obj, f)

@staticmethod
def load(filename):
with open(filename, "rb") as f:
entry = cPickle.load(f)
return entry

if __name__ == "__main__":
pickle.dump({}, "hoge.pickle")
print pickle.load("hoge.pickle")


上記をコンパイルしてpickle.dllにすれば、Booコードで下記のようにして使える。
pyEngine = Python.CreateEngine()

// load IronPython class
myclass = Assembly.LoadFile(Path.GetFullPath("pickle.dll"))
pyEngine.Runtime.LoadAssembly(myclass)
pyScope = IronPython.Hosting.Python.ImportModule(pyEngine, "MyClass")
IpyClass = pyScope.GetVariable("pickle")
pyEngine.Operations.InvokeMember(IpyClass, "dump", 1, "hoge.pickle");
result = pyEngine.Operations.InvokeMember(IpyClass, "load", "hoge.pickle");
print result



DLL化されたIronPythonクラスをC#でラッピングするというやり方もある。BooからC#を介してIronPythonを扱う。


C#でクラスプロジェクトを作成。IronPythonのDLL化されたクラスを参照に追加して、コンパイルでDLL化。CsPickle.dllができるとする。
using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;

using IronPython.Hosting;
using Microsoft.CSharp;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;

namespace CsPickle
{
public class Pickle
{
public static void Dump(object obj, string filename)
{
ScriptEngine pyEngine = Python.CreateEngine();

// load IronPython class
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("pickle.dll"));
pyEngine.Runtime.LoadAssembly(myclass);
ScriptScope pyScope = pyEngine.Runtime.ImportModule("MyClass");

dynamic pickle = pyScope.GetVariable("pickle");
pickle.dump(obj, filename);
}

public static object Load(string filename)
{
ScriptEngine pyEngine = Python.CreateEngine();

// load IronPython class
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("pickle.dll"));
pyEngine.Runtime.LoadAssembly(myclass);
ScriptScope pyScope = pyEngine.Runtime.ImportModule("MyClass");

dynamic pickle = pyScope.GetVariable("pickle");
return pickle.load(filename);
}

static void Main()
{
ScriptEngine pyEngine = Python.CreateEngine();

// load IronPython class
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("pickle.dll"));
pyEngine.Runtime.LoadAssembly(myclass);
ScriptScope pyScope = pyEngine.Runtime.ImportModule("MyClass");

dynamic pickle = pyScope.GetVariable("pickle");
Console.WriteLine(pickle.load("hoge.pickle"));
Console.ReadKey();
}
}
}


最後に。Booコードに上記までで生成されたDLL参照を追加し、下記のように。先にC#で手順を消化している分、Booコードとしてはこっちのやり方のほうがシンプルになる。
import CsPickle

obj = {"hoge": "hoge"}
Pickle.Dump(obj, "hoge.pickle")
hash = Pickle.Load("hoge.pickle") as Hash
print hash["hoge"]
スポンサーサイト



プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon