【问题标题】:Passing pickle between Python and IronPython在 Python 和 IronPython 之间传递 pickle
【发布时间】:2012-07-12 18:14:26
【问题描述】:

我无法在 Python 中加载一个在 IronPython 中转储的泡菜。

当我在 IronPython 中腌制像“[1,2,3]”这样的基本内容时,腌菜在 Python 中加载得很好。但是,当我在 IronPython 中从下面的 DB 查询中提取结果时,尝试在 Python 中加载 pickle 时出现错误“No module named 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"

【问题讨论】:

  • 看起来您的 IronPython 安装可能安装了模块 clr 而您的 Cpython 安装没有。
  • 没错。 CLR 是 .NET 特定的,不能作为常规 Python 的一部分使用。
  • 看起来都是原始类型,所以应该没有问题。如果可能的话,你能在ironpython.codeplex.com/WorkItem/Create 上打开一个问题并附上泡菜文件吗?我想知道涉及到哪些类型。

标签: python clr ironpython pickle importerror


【解决方案1】:

Pickling 确实是在 python 之间共享数据的一种很好的通用方式(当您可以信任数据并且知道它没有被篡改时)。但它只适用于简单的内置类型。当你有特殊类型的对象时(比如GetData() 的结果是什么),那么pickling 将嵌入类的完全限定名称,并且只希望另一端的python 知道如何找到该类并且重新实例化它。不用说,如果您不小心,这会变得非常混乱。

尝试将您的 results1results2 值转换为简单类型,例如(可能是嵌套的)元组、字典、列表等。

【讨论】:

    【解决方案2】:

    您正在酸洗的数据不是由通用 Python 对象组成,而是包含一些依赖于实现的对象。 clr 是 IronPython 特定的模块,因为它的名字暗示了与 .NET 的连接。查看您的数据,我猜这与您的日期时间对象有关。

    尝试为您的序列化数据使用日期时间以外的格式,例如 UNIX 纪元时间:

    import time
    results['Date'] = time.mktime(datetime.datetime(MyReader[1]).timetuple())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2011-12-03
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多