Python多进程:属性错误:无法pickle本地对象。

3

我使用这个框架为协作工具Mattermost编写了一个ChatOps机器人。现在我正试图编写和运行集成测试,并使用他们的示例。通过克隆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中。您可以在这里查看我的源代码。通过运行命令pytest --capture=no --log-cli-level=DEBUG .启动测试后,它将返回以下错误:AttributeError: Can't pickle local object 'start_bot.<locals>.run_bot'。这个错误也出现在他们项目中的同一测试用例中。错误发生在utils.py文件的第92行。此处有该文件。

我在这里做错了什么?


不了解你的问题,但我建议看一下 multiprocessing_on_dill https://pypi.org/project/multiprocessing_on_dill/ - D A
我的问题哪里不容易理解?@DAdams,你可以很简单地复现他们在GitHub存储库中记录的案例:https://github.com/attzonko/mmpy_bot/tree/main/tests/integration_tests - Lucas Scheepers
抱歉!我的评论并不是对你的问题提出批评,因为它看起来写得很好。我的意思是说——我没有足够的知识或经验来解决你问题的真正原因。然而,我自己遇到了一些通用的多进程pickle问题,并发现multiprocessing_on_dill几乎总是适用于我。 - D A
好的,我明天会研究一下。希望其他人有更多经验来解决这个问题的根本原因 :) - Lucas Scheepers
2个回答

0

我有完全相同的环境:Python 3.8.2和Pytest 6.2.5。同时,我正在运行问题中提到的不同命令,并返回“pickle错误”。当我尝试使用您正在使用的命令:“pytest . -vv -n auto”时,它返回:“无法识别的参数:-n auto”。您知道原因吗?此外,我六天前发布了这个问题,测试是在7天前运行的,也许这就解释了为什么现在在我的本地机器上失败了? - Lucas Scheepers
这是1小时前的运行记录:https://github.com/attzonko/mmpy_bot/runs/4356753006?check_suite_focus=true - Plazgoth

0

我不知道你是否已经尝试过这种方法,但我认为你可以通过让 run_bot 接受它所使用的 bot.run() 作为参数,并将其传递给进程来解决 pickling 错误。


不太明白你的意思。我尝试了多种方法,例如将“bot”作为参数传递,但都没有成功 :( - Lucas Scheepers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接