当 sys.path 不同时,dill python 模块是否处理导入模块?

2024-06-03

我正在评估莳萝,我想知道这种情况是否得到处理。我有一个案例,我在 python 进程中成功导入了一个模块。我可以使用 dill 进行序列化,然后在具有不包含该模块的不同 sys.path 的不同进程中加载​​该模块吗?现在我导入失败,但也许我做错了什么。

这是一个例子。我运行此脚本,其中 foo.py 模块的路径位于我的 sys.path 中:

% cat dill_dump.py 
import dill
import foo
myFile = "./foo.pkl"
fh = open(myFile, 'wb')
dill.dump(foo, fh)

现在,我在 PYTHONPATH 中没有 foo.py 目录的情况下运行此脚本:

% cat dill_load.py 
import dill
myFile = "./foo.pkl"
fh = open(myFile, 'rb')
foo = dill.load(fh)
print foo

它失败并显示以下堆栈跟踪:

Traceback (most recent call last):
  File "dill_load.py", line 4, in <module>
    foo = dill.load(fh)
  File "/home/b/lib/python/dill-0.2.4-py2.6.egg/dill/dill.py", line 199, in load
    obj = pik.load()
  File "/rel/lang/python/2.6.4-8/lib/python2.6/pickle.py", line 858, in load
    dispatch[key](self)
  File "/rel/lang/python/2.6.4-8/lib/python2.6/pickle.py", line 1133, in load_reduce
    value = func(*args)
  File "/home/b/lib/python/dill-0.2.4-py2.6.egg/dill/dill.py", line 678, in _import_module
    return __import__(import_name)
ImportError: No module named foo

那么,如果我需要在两个进程之间拥有相同的 python 路径,那么序列化 python 模块有什么意义呢?或者换句话说,通过 dill 加载 foo 比仅进行“import foo”调用有什么优势吗?


这是一个有趣的失败。请注意,如果您这样做dill.dumps(foo)你会得到模块的内容foo…失败的部分是使用 python 的内置导入钩子(__import__)除了将模块注册到sys.modules。应该可以解决这个问题并修改dill这样,如果在 PYTHONPATH 中找不到该模块,则可以导入该模块。但是,我确实认为必须在 PYTHONPATH 中找到该模块是正确的……这就是对模块的期望……所以我不确定这是否是一个好主意。但这可能是...

如上所述,对于一个文件foo.py,内容:hello = "hello world, I am foo"

>>> import dill
>>> import foo
>>> dill.dumps(foo)
'\x80\x02cdill.dill\n_import_module\nq\x00U\x03fooq\x01\x85q\x02Rq\x03}q\x04(U\x08__name__q\x05h\x01U\x08__file__q\x06U\x06foo.pyq\x07U\x05helloq\x08U\x15hello world, I am fooq\tU\x07__doc__q\nNU\x0b__package__q\x0bNub.'

您可以看到文件的内容被保存在pickle中。

使用的主要原因dill与模块,是dill可以记录对模块的动态修改。例如,添加函数或其他对象:

>>> import foo 
>>> import dill
>>> foo.a = 100
>>> with open('foo.pkl', 'w') as f:
...   dill.dump(foo, f)
... 
>>> 

然后重新启动...(与foo在Python路径中)

Python 2.7.10 (default, May 25 2015, 13:16:30) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('foo.pkl', 'r') as f:
...   foo = dill.load(f)
... 
>>> foo.hello
'hello world, I am foo'
>>> foo.a
100
>>> 

我已将其添加为错误报告/功能请求:https://github.com/uqfoundation/dill/issues/123 https://github.com/uqfoundation/dill/issues/123

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

当 sys.path 不同时,dill python 模块是否处理导入模块? 的相关文章

随机推荐

  • 如何使用 Apache Camel 路由从授权服务器获取访问令牌?

    我有一个授权服务器 带有注释的简单类 SpringBootApplication RestController Configuration EnableAuthorizationServer oauth2 security 在端口上运行80
  • Spring 可以理解 @Inject 替换 Weld 作为 JSR-299 实现吗?

    我从几个网页中注意到 Spring 3 0 显然支持来自 JSR 330 的 Inject 由于我们确实希望在 Web 应用程序和独立应用程序的库中使用 JSR 299 语法进行依赖项注入 并且有 Weld 的替代方案 因此如果 Sprin
  • 'ExecuteReader 需要一个开放且可用的连接。连接的当前状态是打开'

    用 C 编写的相当大的 Web 应用程序不断抛出 2 个错误 ExecuteReader 需要一个开放且可用的连接 连接的当前状态是打开的 和 阅读器关闭时调用 Read 的尝试无效 这些错误是零星的 过去页面在大约 95 的情况下加载良好
  • ImportError:从其他 Python 脚本调用时没有名为 xmltodict 的模块

    我有一个奇怪的问题 我使用的是 Py2 7 我正在从 python 脚本调用 py 文件 下面是我的代码 调用者 py import os import subprocess filename file py data aXD output
  • std::ofstream 对象无法正常关闭的任何原因?

    我注意到在我的 C 代码中 每当我关闭一个std ofstream对象我无法重新打开我关闭的文件std ifstream std ifstream s open功能总是会失败 我可以做些什么来确保我的 std ofstream 对象正确关闭
  • Android 视频循环缓冲区与声音

    我正在使用谷歌的开源示例 Grafika https github com google grafika 我正在使用它ContinuousCaptureActivity java https github com google grafik
  • bash 递归xtrace

    有没有办法运行 bash 脚本 X 以便如果 X 调用可执行 bash 脚本 Y 则 Y 以 sh eux 开头 X sh Y sh Y sh bin sh echo OK 可以通过导出子 shell 使用父 shell 中设置的相同 sh
  • 重新排列 numpy 数组

    我正在尝试 就地 修改 numpy 数组 我感兴趣的是就地重新排列数组 而不是 return ing 数组的重新排列版本 这是一个示例代码 from numpy import def modar arr arr arr 1 0 commen
  • 为什么路径压缩不会改变 UnionFind 中的排名?

    我正在研究 UnionFind 的实现 并从这里进行排序和路径压缩http en wikipedia org wiki Disjoint set data struct Disjoint set forests http en wikipe
  • postgres - 错误:运算符不存在

    再说一次 我有一个在本地运行良好的函数 但是将其转移到网上会产生一个很大的错误 从有人指出我传递的参数数量不准确的响应中得到提示 我双重 在这种情况下检查以确保我向函数本身传递了 5 个参数 Query failed ERROR opera
  • dyld:找不到符号:_kABPersonAddressCityKey XCODE 8 问题

    你好 我的代码在 xcode 中完美运行7 x x 当我更新我的 xcode 时 我遇到了这个问题 请给我解决方案 细节 dyld 未找到符号 kABPersonAddressCityKey 引用自 var containers Bundl
  • 通过 Google HTTP 客户端向 Box API 发出多部分请求

    我正在尝试调用这个特定方法http developers box com docs files upload a file http developers box com docs files upload a file在 Google H
  • 熊猫 groupby 到 to_csv

    想要将 Pandas groupby 数据帧输出到 CSV 尝试了各种 StackOverflow 解决方案 但都没有奏效 Python 3 6 1 熊猫0 20 1 groupby 结果如下所示 id month year count w
  • 如何确定子字符串是否在不同的字符串中[重复]

    这个问题在这里已经有答案了 我有一个子字符串 substring please help me out 我还有另一个字符串 string please help me out so that I could solve this 我如何找到
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 如何更改ComboBox所选项目的前景色?

    是否可以更改所选 不在下拉列表中 项目的外观 combobox ForeColor 仅更改下拉列表中所有项目的文本颜色 Edit 变体如下 我们的是 public static void CBoxDrawItem object sender
  • 如何强制网络浏览器不缓存图像

    背景 我正在为两个公益网站编写并使用一个非常简单的基于 CGI Perl 的内容管理工具 它为网站管理员提供了事件的 HTML 表单 他们可以在其中填写字段 日期 地点 标题 描述 链接等 并保存 在该表格上 我允许管理员上传与该活动相关的
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 如何在React-Native中选择ListView的一项?

    我是 React Native 的新手 我想使用 ListView 选择一项 当我第一次按下 item 时 ListView renderRow 被调用 但终究不起作用 我该如何修复这个错误 我的问题出在哪里 我写了一个演示here htt
  • 当 sys.path 不同时,dill python 模块是否处理导入模块?

    我正在评估莳萝 我想知道这种情况是否得到处理 我有一个案例 我在 python 进程中成功导入了一个模块 我可以使用 dill 进行序列化 然后在具有不包含该模块的不同 sys path 的不同进程中加载 该模块吗 现在我导入失败 但也许我