如何pickle python 函数及其依赖项?

2024-03-19

作为这个问题的后续:有没有一种简单的方法来pickle python 函数(或以其他方式序列化其代码)? https://stackoverflow.com/questions/1253528/is-there-an-easy-way-to-pickle-a-python-function-or-otherwise-serialize-its-cod

我想从上面的帖子中看到这个项目符号的示例:

“如果函数引用您需要获取的全局变量(包括导入的模块、其他函数等),您也需要序列化它们,或者在远程端重新创建它们。我的示例只是为其提供了远程进程的全局命名空间。 ”

我有一个简单的测试,我使用 marshal 将函数字节代码写入文件:

def g(self,blah): 
    print blah

def f(self):
    for i in range(1,5):
        print 'some function f'
        g('some string used by g')

data = marshal.dumps(f.func_code)

file = open('/tmp/f2.txt', 'w')
file.write(data)

然后启动一个新的 python 实例:

file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')

这导致:

NameError: global name 'g' is not defined

这与我为包含 g 所采取的不同方法无关。我已经尝试了与 f 发送 g 基本相同的方法,但 f 仍然看不到 g。如何让 g 进入全局命名空间,以便 f 在接收进程中可以使用它?

有人还建议查看 Pyro 作为如何执行此操作的示例。我已经尝试过尝试理解迪斯科项目中的相关代码。我学习了他们的 dPickle 类,并尝试在独立应用程序中重新创建他们的 disco/tests/test_pickle.py 功能,但没有成功。我的实验在使用转储调用进行函数封送时遇到了问题。无论如何,也许下一步就是进行火工探索。

总之,我所追求的基本功能是能够通过线路发送方法,并发送所有基本的“工作区”方法(如 g)。

答案更改的示例:

工作函数_writer:

import marshal, types

def g(blah): 
    print blah


def f():
    for i in range(1,5):
        print 'some function f'
        g('blah string used by g')


f_data = marshal.dumps(f.func_code)
g_data = marshal.dumps(g.func_code);

f_file = open('/tmp/f.txt', 'w')
f_file.write(f_data)

g_file = open('/tmp/g.txt', 'w')
g_file.write(g_data)

工作函数_reader:

import marshal, types

f_file = open('/tmp/f.txt', 'r')
g_file = open('/tmp/g.txt', 'r')

f_code = marshal.loads(f_file.read())
g_code = marshal.loads(g_file.read())

f = types.FunctionType(f_code, globals(), 'f');
g = types.FunctionType(g_code, globals(), 'g');

f()

2020 年 9 月更新:请参阅下面@ogrisel 的评论。在我于 2013 年写出这个答案的原始版本后不久,PiCloud 的开发人员就转移到了 Dropbox,尽管七年后很多人仍在使用 cloudpickle 模块。该模块已进入 Apache Spark,并继续得到维护和改进。我正在相应地更新下面的示例和背景文本。

云泡菜

The 云泡菜 https://github.com/cloudpipe/cloudpicklepackage 能够 pickle 函数、方法、类、甚至 lambda 以及任何依赖项。要尝试一下,只需pip install cloudpickle进而:

import cloudpickle

def foo(x):
    return x*3

def bar(z):
    return foo(z)+1

x = cloudpickle.dumps(bar)
del foo
del bar

import pickle

f = pickle.loads(x)
print(f(3))  # displays "10"

换句话说,只需调用cloudpickle.dump() or cloudpickle.dumps()和你使用的方式一样pickle.*,然后稍后使用本机pickle.load() or pickle.loads()解冻。

背景

PiCcloud.com发布了cloudLGPL 下的 python 包,其他开源项目很快就开始使用它(google forcloudpickle.py看看几个)。 picloud.com 的人们有动力投入精力来实现通用代码酸洗工作——他们的整个业务都是围绕它建立的。我们的想法是,如果你有cpu_intensive_function()并想在 Amazon 的 EC2 网格上运行它,您只需替换:

cpu_intensive_function(some, args) 

with:

cloud.call(cpu_intensive_function, some, args)

后者使用了cloudpickle选取任何相关代码和数据,将其发送到 EC2,运行它,并在您调用时将结果返回给您cloud.result().

Picloud 以毫秒为单位计费,它非常便宜,我一直使用它进行蒙特卡罗模拟和金融时间序列分析,当时我需要数百个 CPU 核心,每个核心只需要几秒钟。多年后,我仍然无法说出足够多的好话,而且我什至没有在那里工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何pickle python 函数及其依赖项? 的相关文章

  • python string format() 与带有整数键的字典[重复]

    这个问题在这里已经有答案了 我想使用Python字符串format 充当快速而肮脏的模板 但是 那dict我想使用的键是整数 字符串表示形式 一个简化的例子如下 s hello there 5 d 5 you s format d 上面的代
  • 从列表中的嵌套字典中删除重复项

    快速且非常基本的新手问题 如果我有如下所示的字典列表 L L append value1 value1 value2 value2 value3 value3 value4 value4 假设存在多个条目 其中 value3 和 value
  • 向 Matplotlib 等高线图添加水流箭头

    我正在使用 Matplotlib 生成地下水高程等值线 见下文 Here is what I have now how can I add water flow arrows like the image below I want to a
  • pandas:groupby 和可变权重

    我有一个数据集 其中每个观察值都有权重 我想使用以下方法准备加权摘要groupby但我对如何最好地做到这一点感到生疏 我认为这意味着自定义聚合函数 我的问题是如何正确处理不是按项目的数据 而是按组的数据 也许这意味着最好分步进行 而不是一次
  • BNF 可以处理远期消费吗?

    最近我发现了 python 模块pyparsing 一个通过编写来解析数据的绝佳工具grammar 而不是解析器 我对上下文无关语法的概念很陌生 所以请纠正这个问题中的任何错误假设 Pyparsing 可以实现 BNF 巴科斯 诺尔范式 h
  • 如何获得我的暴力破解的百分比?

    我需要帮助来了解如何计算脚本进度的百分比 因为这需要一段时间 具体取决于 CPU 时钟速度 RAM 和目标密码列表的长度 您能否为我指出正确的方向 或者向我展示如何计算此值的片段 import itertools math Alphabet
  • 如何仅在内存中运行 Django 测试数据库?

    我的 Django 单元测试需要很长时间才能运行 因此我正在寻找加快速度的方法 我正在考虑安装一个SSD http en wikipedia org wiki Solid state drive 但我知道这也有其缺点 当然 我可以用我的代码
  • 将自定义操作添加到 UserModel 的管理页面

    是否有可能在 django UserModel 的管理页面中创建自定义操作 我希望自动将用户添加到组中 例如将他添加到员工中 设置一些额外的值等 当然还要创建收回这些更改的操作 感谢您的帮助 Import User在你的 admin py
  • distutils:如何将用户定义的参数传递给setup.py?

    如何将用户定义的参数从命令行和 setup cfg 配置文件传递到 distutils 的 setup py 脚本 我想编写一个 setup py 脚本 它接受我的包特定参数 例如 python setup py install foo m
  • doctest (python) 中的模拟 Y (from X import Y)

    我正在尝试创建一个带有模拟功能的文档测试 该功能位于单独的模块中 导入如下 from foomodule import foo def bar gt gt gt from minimock import mock gt gt gt mock
  • PyCharm 上的远程调试

    我的源代码存储在远程计算机上 我想远程编码和调试我的Python源代码 我应该如何配置PyCharm启用远程调试 对于远程调试 您需要将源代码复制到本地计算机 设置项目 配置到远程计算机的部署并添加远程 Python 解释器以在远程系统上运
  • 将 SSIM 损失函数与 Keras 结合使用

    我需要使用 Sewar 的 SSIM 作为损失函数 以便比较我的模型的图像 当我尝试编译模型时出现错误 我导入该函数并编译模型 如下所示 from sewar full ref import ssim model compile ssim
  • 如何格式化字符串以在 Python 中使用 mysqldb 进行查询?

    我该如何正确执行此操作 我想做这样的查询 query SELECT FROM sometable order by s s limit s s conn app globals pool connection cur conn cursor
  • Django Rest Framework 嵌套序列化器不显示相关数据

    我使用 Django Rest Framework 进行了基本设置 我有两个模型和一个嵌套序列化器设置 models py from django db import models class Plan models Model name
  • 通过getattr动态获取dict元素?

    我想动态查询我想要检索的类中的哪些对象 getattr似乎是我想要的 并且它对于类中的顶级对象表现良好 但是 我还想指定子元素 class MyObj object def init self self d a 1 b 2 self c 3
  • 对自定义类进行排序而不使用“key”参数?

    您可以对数组进行排序myclass通过使用key论证sorted功能 sortedlist sorted myclasses key lambda obj obj myproperty 有没有办法为我们的班级定义自然顺序 也许有一些神奇的方
  • 在 ReportLab 中向画布元素添加超链接的最简单方法是什么?

    我正在使用 ReportLab 使用 Python 制作 pdf 我想向画布添加一个形状 并让该形状充当超链接 使以下示例中的矩形链接到 google com 的最简单方法是什么 from reportlab pdfgen import c
  • 如何从 Django 中的 ModelForm 手动创建选择字段?

    我有一个ModelForm其中字段之一 名为creator is a ForeignKey 因此对于 form creator Django 渲染
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基
  • Python 中的类位于不同的文件中吗?

    与 Java 或 php 非常相似 我习惯将类与文件分开 Python 中也是同样的情况吗 另外 我应该如何命名该文件 像classname py一样小写还是像ClassName py一样 如果我想从此类创建一个对象 我是否需要做一些特殊的

随机推荐

  • 我可以调整 tkMessagebox 创建的消息框的大小吗?

    我想用固定宽度的 tkMessagebox 创建信息对话 我在 tkMessagebox showinfo 函数中没有看到任何可以处理此问题的选项 有什么办法吗 谢谢 option add 可能仅适用于 Linux 操作系统 但您可以控制字
  • Javascript:xmlhttprequest 随机卡在就绪状态 1

    我一直在开发一个 Windows 小工具 即 浏览器 是 Internet Explorer 用于查询指定子网地址以获取信息 现在 它有时会以相对较快的速度 大约每 5 秒 执行此操作 而且效果很好 然而 有时它会卡在就绪状态 1 并且永远
  • 使用 Popen.stdin 执行多个命令

    我想使用管道在从 python 脚本启动的独立应用程序中执行多个命令 我可以可靠地将命令传递到程序的标准输入的唯一方法是使用 Popen communicate 但它会在命令执行后关闭程序 如果我使用 Popen stdin write 则
  • 如何列出导入的模块及其版本?

    我需要列出所有导入的模块及其版本 我的一些代码仅适用于特定版本 我想保存包的版本 以便将来再次查找 列出包的名称有效 modules list set sys modules set globals print modules 但如果我现在
  • 注入自动映射器

    我一直致力于将 AutoMapper 注入控制器 我喜欢 Code Camp Server 的实现 它围绕 AutoMapper 的 IMappingEngine 创建一个包装器 依赖注入是使用 StructureMap 完成的 但我需要在
  • 有什么办法让 gmaps4rails 在街景中打开地图吗?

    我尝试过更改缩放级别 但它始终保持在地图模式 在wiki上也找不到任何信息 任何帮助或其他建议将不胜感激 最终只使用了 Google 的 Javascript API 事情是这样的 pos new google maps LatLng va
  • 如何将 Knockout js 模型绑定到向导风格的 UI

    我正在使用 Knockout js 我有一个包含对象数组的视图模型 我希望允许用户使用向导样式界面编辑其中一个对象 我遇到的问题是向导将根据所做的选择显示不同的步骤 例如 如果用户在步骤 1 中选择 是 则我将显示步骤 2a 如果用户在步骤
  • 在读取文件之前检查文件是否已打开?

    我正在尝试制作一个小程序 它以非常频繁的间隔 每秒几次 读取本地文件系统 用户计算机 上的文件 然后通过 javascript 将文件的内容提供给网页 小程序需要读取的文件由用户计算机上的程序高频更新 我担心的是 如果小程序在文件更新过程中
  • toDF 的值不是 org.apache.spark.rdd.RDD 的成员

    例外 val people sc textFile resources people txt map split map p gt Person p 0 p 1 trim toInt toDF value toDF is not a mem
  • 在 GNU C 内联汇编中编写 Linux int 80h 系统调用包装器 [重复]

    这个问题在这里已经有答案了 我正在尝试使用内联汇编 我读过这一页http www codeproject com KB cpp edujini inline asm aspx http www codeproject com KB cpp
  • Python 日期时间:昨天的所有项目

    在 Python 中 如果我想检查昨天的所有项目 我会这样做 from datetime import datetime timedelta if datetime datetime today timedelta days 2 lt it
  • C# 将文本转语音保存到 MP3 文件

    我想知道是否有办法将文本到语音数据保存为 mp3 或 Wav 文件格式以便稍后播放 SpeechSynthesizer reader new SpeechSynthesizer reader Rate int 2 reader Speak
  • Windows 键的键码?

    有没有keyCodeWindows 键或用 Javascript 或 jQuery 检测何时按下的方法 I ve dug through StackOverflow and have found how to detect command
  • 如何在 JavaScript 中一次分配多个变量?

    有没有办法在 JavaScript 中执行多重赋值 如下所示 var a b one two 这相当于 var a one var b two 在 ES6 中你可以这样做 var a b one two 上面的代码是 ES6 表示法 称为数
  • 是否可以使用 Spring XML 访问字符串索引的 getter?

    Spring上下文设置XML语言中是否有 字符串索引 getters的概念 假设我有Persongetter 具有以下原型 class Person Person getRelative String relativeName 我可以用类似
  • Java引用同一目录中的类

    我创建了一个PairJava 中的类 类似于 C 对 并且无法从不同的 java 文件引用它 我正在一个 Java 文件中工作 我们称之为fileA在同一目录中Pair class 另外 我还写过package current direct
  • 使用 MVC2 的 AJAX 请求中的 CSRF 保护

    我正在构建的页面很大程度上依赖于 AJAX 基本上 只有一个 页面 并且每次数据传输都是通过 AJAX 处理的 由于浏览器端过度乐观的缓存会导致奇怪的问题 数据未重新加载 因此我必须使用 POST 执行所有请求 也读取 这会强制重新加载 现
  • React Native/Redux 应用程序中可能存在导航问题

    在使用 Redux 在大型 React Native 应用程序中导航期间 所有访问的场景 导航堆栈中的场景 都保持安装状态 当从最后一个场景组件调度任何动作时 所有这些场景都会接收道具并按照访问它们的顺序进行渲染 它会导致调度和最后一个场景
  • 如何使用消息代理和数据库设计分布式应用程序?

    我想实现一个分布式销售点系统 有点像中描述的系统销售点应用程序架构建议 https stackoverflow com questions 2454629 point of sale app architecture advice 它是一个
  • 如何pickle python 函数及其依赖项?

    作为这个问题的后续 有没有一种简单的方法来pickle python 函数 或以其他方式序列化其代码 https stackoverflow com questions 1253528 is there an easy way to pic