Итак, у меня есть этот сценарий, я создаю function
, который зависит от pandas
, который я затем pickle
перезагружаю и пытаюсь запустить, и выдает error
это pd is not defined
:
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
После этого я import pandas as pd
и вызывается код.
Но я не могу воспроизвести это поведение внутри тестовой функции pytest
. Даже если я добавлю import pandas as pd
, я все равно получу NameError
pd is not defined
. Есть идеи, почему?
@MrBeanBremen Я думаю, это причина неудачи, но я все еще пытаюсь понять, как это работает, есть ли хороший ресурс, чтобы понять это поведение?
У меня нет конкретных доступных ресурсов, но вы можете найти подсказку в документации в конце главы.
Как указал @MrBeanBremen в связанном вопросе в комментарии, импорт __main__
, а затем определение pandas
в __main__
помогло:
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. Проверьте, похожа ли ваша проблема на этот вопрос.