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”

odoo 多线程处理(AttributeError: environments)

Python中链表中的'AttributeError'