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先生,我想这就是失败的原因,但仍在努力掌握这件事是如何运作的,有什么好的资源来理解这种行为吗?我没有任何可用的具体资源,但你可以在本章末尾找到一个提示。