Python Can';t在pytest测试中使用pickled函数
所以我有这个场景,我创建了一个Python Can';t在pytest测试中使用pickled函数,python,pytest,pickle,Python,Pytest,Pickle,所以我有这个场景,我创建了一个函数,它依赖于熊猫,然后我pickle,然后重新加载并尝试运行,并给出错误,即pd未定义: def pandize(arg): pd.DataFrame('a') import dill with open('pandize.pkl', 'wb') as f: dill.dump(pandize, f) with open('pandize.pkl', 'rb') as f: p = dill.load(f) p(1) NameErro
函数
,它依赖于熊猫
,然后我pickle
,然后重新加载并尝试运行,并给出错误
,即pd未定义
:
def pandize(arg):
pd.DataFrame('a')
import dill
with open('pandize.pkl', 'wb') as f:
dill.dump(pandize, f)
with open('pandize.pkl', 'rb') as f:
p = dill.load(f)
p(1)
NameError: name 'pd' is not defined
之后,我将pandas导入为pd
,并调用代码
但是我不能在
pytest
test函数中复制这种行为。即使我将导入熊猫作为pd
添加,我仍然会得到名称错误
未定义pd
。有什么想法吗?正如@MrBeanBremen在评论中的链接问题中指出的那样,导入\uuuuuuu main\uuuu
,然后在\uuuuu main\uuuuu
中定义熊猫
,这是一个技巧:
import pandas as pd
import __main__
__main__.pd = pd
with open('pandize.pkl', 'rb') as f:
p = dill.load(f)
p(1)
此设置不会再导致测试失败并出现
NameError
。我不确定dill
的行为是否相同,但pickle
会保存相对于当前模块的对象,如果从pytest调用,该对象可能会更改。看看你的问题是否与类似。@Beanbremen先生,我想这就是失败的原因,但仍在努力掌握这件事是如何运作的,有什么好的资源来理解这种行为吗?我没有任何可用的具体资源,但你可以在本章末尾找到一个提示。