python - 如何在内部转储带有导入的函数
问题描述
我正在尝试将函数转储到文件中,以便可以在其他地方使用此文件/函数。我选择dill
而不是pickle
,因为我需要依赖项。但是,dill
如果函数内部有导入,则不起作用。例如:
def func():
import numpy
import dill
dill.settings['recurse'] = True
with open("test.pickle","wb") as f:
dill.dump(func,f)
当我重新启动并重新加载函数时,出现此错误,
import dill
func = dill.load(open("test.pickle"))
func()
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input> in <module>()
1 import dill
2 func = dill.load(open("test.pickle"))
----> 3 func()
<ipython-input> in func()
ImportError: __import__ not found
如果我使用pickle
转储,此示例有效,但pickle
似乎不能递归保存依赖项,因此我无法保存def fun1(): return fun2()
. 有没有办法转储具有导入和依赖项的函数?我觉得pickle
还是dill
只做了一半。
解决方案
我是dill
作者。我相信dill
也应该为你工作:
$ python
Python 3.6.10 (default, Dec 21 2019, 11:39:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> def func():
... import numpy
...
>>> import dill
>>>
>>> with open('XXX.pkl', 'wb') as f:
... dill.dump(func, f)
...
>>>
$ python
Python 3.6.10 (default, Dec 21 2019, 11:39:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> func = dill.load(open('XXX.pkl', 'rb'))
>>> func()
>>>
这些recurse
设置意味着通过全局字典递归跟踪引用,但不存储整个全局字典。的默认设置dill
是在酸洗函数时存储所有全局字典。因此,recurse
可以使泡菜更小,但它们也可能由于缺少参考而失败。
推荐阅读
- c++ - 如果只有一个条目,反向 For 循环会完全跳过吗?
- html - SVG 徽标上缺少字体
- html - 我有一个项目的两个 id,这是一个致敬页面,需要两个 id 才能通过,但是当我将标题居中时,它不会居中
- java - 获取对象数量构造失败
- jenkins - 完成后自行删除 Jenkins 构建
- excel - 在单列中填充范围内的单元格,但仅填充下一个空白单元格
- java - 如何在运行时将“插件”参数传递给@CucumberOptions
- uwp - 为什么显示我的 ContentDialog 的异步/等待代码在运行时失败?
- javascript - 经过多次尝试,失败了。编辑ckeditor
- python - Dask - 如何有效地执行正确数量的任务