2013
07
31
07
31
Boo: コンパイルされたIronPythonモジュールを使うために
コンパイルされたIronPythonのクラスをBooで使う。コンパイルされたIronPythonスクリプトは下記のもので、MyClass.pyという名前。
上記をコンパイルしてpickle.dllにすれば、Booコードで下記のようにして使える。
DLL化されたIronPythonクラスをC#でラッピングするというやり方もある。BooからC#を介してIronPythonを扱う。
C#でクラスプロジェクトを作成。IronPythonのDLL化されたクラスを参照に追加して、コンパイルでDLL化。CsPickle.dllができるとする。
最後に。Booコードに上記までで生成されたDLL参照を追加し、下記のように。先にC#で手順を消化している分、Booコードとしてはこっちのやり方のほうがシンプルになる。
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"]
スポンサーサイト