9

IronPython でダンプされたピクルを Python でロードするのに苦労しています。

IronPython で "[1,2,3]" のような基本的なものをピクルすると、ピクルは Python で正常に読み込まれます。しかし、IronPython で以下の DB クエリの結果をピクルすると、Python でピクルをロードしようとすると、「clr という名前のモジュールがありません」というエラーが表示されます。

何がうまくいかないのですか?(そして、Python と IronPython の間でデータを共有するためのより良い方法はありますか?)

def GetData(id):
    TheConnection = SqlClient.SqlConnection("server=MyServer;database=MyDB;Trusted_Connection=yes")
    TheConnection.Open()
    sqlcommand = "MyStoredProcedure#GetMyData '%s'" %id

    MyAction = SqlClient.SqlCommand(sqlcommand, TheConnection)
    MyReader = MyAction.ExecuteReader()

    results = list()

    while MyReader.Read():
        row = {
               'Type':'LolCat',
               'Date':datetime.datetime(MyReader[1]),
               'Location':str(MyReader[3]),
               'Weight':float(MyReader[6])/float(MyReader[7]),
               }
        results.append(row)

    TheConnection.Close()
    MyReader.Close()

    return results



results1 = GetData(1234)
results2 = GetData(2345)

...
picklefile= open("testpickle","w")
cPickle.dump((results1,results2),picklefile)

...
picklefile = open("testpickle","r")
p = cPickle.load(file)  # this is the line that gives the error "ImportError: No module named clr"
4

2 に答える 2

4

ピクルスは確かに、Python間でデータを共有するための優れた一般的な方法です(データを信頼でき、データが改ざんされていないことがわかっている場合)。しかし、それは単純な組み込み型にのみ本当に適しています。特別なタイプのオブジェクト(結果が何であれGetData())がある場合、picklingはクラスの完全修飾名を埋め込み、もう一方のPythonがそのクラスを見つけて再インスタンス化する方法を知っていることを期待します。言うまでもなく、注意しないと、これは非常に厄介になる可能性があります。

値を(ネストされている可能性のある)タプル、dict、リストなどの単純な型にresults1変換してみてください。results2

于 2012-07-12T18:21:13.390 に答える
2

ピクルしているデータは、一般的な Python オブジェクトで構成されていませんが、実装に依存するオブジェクトがいくつかあります。clrその名前は .NET への接続を意味するため、IronPython 固有のモジュールです。あなたのデータを見ると、これはあなたのdatetimeオブジェクトに関係していると思います。

UNIX エポック時間など、シリアル化されたデータに datetime 以外の形式を使用してみてください。

import time
results['Date'] = time.mktime(datetime.datetime(MyReader[1]).timetuple())
于 2012-07-12T18:22:27.523 に答える