Python多处理:AttributeError:无法腌制本地对象
Posted
技术标签:
【中文标题】Python多处理:AttributeError:无法腌制本地对象【英文标题】:Python multiprocessing: AttributeError: Can't pickle local object 【发布时间】:2022-01-02 04:38:51 【问题描述】:我使用 this framework 为协作工具 Mattermost 编写了一个 ChatOps 机器人。现在我正在尝试编写和运行集成测试,我使用了他们的examples。通过克隆 git 存储库,您可以自己运行测试。他们的docker-compose.yml
文件只能在 Linux 机器上运行。如果你想在 Mac 机器上重现它,你必须将docker-compose.yml
编辑为:
version: "3.7"
services:
app:
container_name: "mattermost-bot-test"
build: .
command: ./mm/docker-entry.sh
ports:
- "8065:8065"
extra_hosts:
- "dockerhost:127.0.0.1"
运行命令docker-compose up -d
后,Mattermost 可在localhost:8065
获得。我只从他们的项目中进行了一项简单的测试,并将其复制到base-test.py
。你可以看到我的源代码here。通过运行命令pytest --capture=no --log-cli-level=DEBUG .
开始测试后,它将返回以下错误:AttributeError: Can't pickle local object 'start_bot.<locals>.run_bot'
。这个错误也出现在他们项目的同一个测试用例中。错误发生在 utils.py
file 的第 92 行
我在这里做错了什么?
【问题讨论】:
在不了解您的问题的情况下,我建议您查看multiprocessing_on_dill
pypi.org/project/multiprocessing_on_dill
我的问题有什么不能理解的? @DAdams 您可以非常简单地重现他们 GitHub 存储库中记录的案例:github.com/attzonko/mmpy_bot/tree/main/tests/integration_tests
对不起!我的评论不是对您的问题的批评,这似乎写得很好。我的意思是说-我没有知识或经验来解决您问题的真正原因。然而,我自己确实遇到了通用的多处理泡菜问题,并发现 multiprocessing_on_dill
几乎总是为我工作。
好的,我明天再看看。希望其他人有更多的经验来解决这个问题的原因:)
【参考方案1】:
查看该 GitHub 存储库上的“操作”选项卡。 Pytest 似乎执行正确(忽略 webhook 测试中的异常)
这是您可以用来比较您的环境设置的最近运行:https://github.com/attzonko/mmpy_bot/runs/4289644769?check_suite_focus=true
【讨论】:
我有完全相同的环境:Python 3.8.2 和 Pytest 6.2.5。此外,我正在运行上述问题中所述的不同命令,它返回pickle error
。当我尝试使用您正在使用的命令时:pytest . -vv -n auto
它返回:unrecognized arguments: -n auto
。你可能知道为什么吗?另外,我在 6 天前发布了这个问题,并在 7 天前运行了测试,也许这可以解释为什么它现在在我的本地机器上失败了?
这是 1 小时前的一次跑步:github.com/attzonko/mmpy_bot/runs/…【参考方案2】:
我不知道你是否已经走上了这条路,但我认为你可以通过让 run_bot 将它所做的机器人 bot.run()
作为参数然后将其传递给进程来克服酸洗错误。
【讨论】:
不太明白你的意思。我尝试了多种方法,例如将bot
作为参数传递但没有成功:(以上是关于Python多处理:AttributeError:无法腌制本地对象的主要内容,如果未能解决你的问题,请参考以下文章
Windows 上的 Python DEAP 和多处理:AttributeError
Python 多处理:AttributeError:“测试”对象没有属性“get_type”
Python多处理错误:AttributeError:模块'__main__'没有属性'__spec__'
Python 错误:AttributeError:“模块”对象没有属性“heappush”