【问题标题】:cython compiled celely run fail whith [AttributeError: 'method-wrapper' object has no attribute '__module__']cython 编译 celely 运行失败 [AttributeError: 'method-wrapper' object has no attribute '__module__']
【发布时间】:2021-12-29 06:37:26
【问题描述】:

我用python中的celery开发了一个项目,并使用cython编译pyd文件,每个文件都很好但是tasks.pyd,它无法运行。我认为该错误可能与@decarator有关,我尝试了没有解决方案的sererval methons,谁能帮助我?先谢谢了。

这是我在 tasks.py 中的代码

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

@app.task
def myTaskFunc(arg1=None, arg2=None):
    some code


Traceback (most recent call last):
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\en-18\AppData\Local\Programs\Python\Python36\Scripts\celery.exe\__main__.py", line 9, in <module>
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\__main__.py", line 16, in main
    _main()
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\celery.py", line 322, in main
    cmd.execute_from_commandline(argv)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\celery.py", line 495, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\base.py", line 305, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\celery.py", line 487, in handle_argv
    return self.execute(command, argv)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\celery.py", line 419, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\worker.py", line 223, in run_from_argv
    return self(*args, **options)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\base.py", line 253, in __call__
    ret = self.run(*args, **kwargs)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\bin\worker.py", line 258, in run
    **kwargs)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\worker\worker.py", line 97, in __init__
    self.on_before_init(**kwargs)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\apps\worker.py", line 93, in on_before_init
    trace.setup_worker_optimizations(self.app, self.hostname)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\app\trace.py", line 596, in setup_worker_optimizations
    app.finalize()
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\app\base.py", line 538, in finalize
    _announce_app_finalized(self)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\_state.py", line 54, in _announce_app_finalized
    callback(app)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\app\base.py", line 411, in cons
    return app._task_from_fun(fun, **opts)
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\app\base.py", line 452, in _task_from_fun
    '__header__': staticmethod(head_from_fun(fun, bound=bind)),
  File "c:\users\en-18\appdata\local\programs\python\python36\lib\site-packages\celery\utils\functional.py", line 279, in head_from_fun
    namespace = {'__name__': fun.__module__}
AttributeError: 'method-wrapper' object has no attribute '__module__'
comtypes        > Calling CoUnititialize()
comtypes        > CoUnititialize() done.

【问题讨论】:

    标签: python celery task cython


    【解决方案1】:

    没有minimal reproducible example 就不可能知道,所以接下来是猜测。

    我怀疑@app.task 要求函数具有一些 Cython 默认不提供的自省属性。尝试的事情:

    1. 使用指令#cython: binding=True。这使得 Cython 函数成为一种自定义对象类型,其行为更像常规函数。
    2. 使用 Cython 3 alpha(虽然谁知道你在这里使用的是什么版本的 Cython,因为你没有说)。它包含对函数自省的一些改进(并默认启用binding=True)。
    3. 用 Python 编写这段代码(例如,您可以使用 exec)。

    【讨论】:

    • 谢谢DavidW,它已经解决了,然后是你的回答。我没有t know where to set [binding=True] as a cython newer, find no result in its 手册。于是我将版本从0.29.25更新到3.0.0.a9,失败就消失了。
    • 很抱歉,我从未在帮助中心阅读过最小可复制示例,事实上我从未浏览过帮助中心。我会认真阅读的。再次感谢 DavidW
    • 相关手册部分:cython.readthedocs.io/en/latest/src/userguide/… - 很高兴它有所帮助
    • 我明白了!非常感谢大卫W
    猜你喜欢
    • 2022-12-01
    • 2015-07-06
    • 2020-04-26
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2022-12-27
    • 2022-01-10
    相关资源
    最近更新 更多