Python RQ 属性错误:'dict'对象没有'__module__'属性

2 投票
1 回答
3224 浏览
提问于 2025-04-17 21:59

我正在尝试使用django_rq这个Python库在Redis中添加一个简单的任务,这个库可以把任务放到队列里,并让后台的工作程序处理它们。但是,当我简单调用的时候却出现了一个错误:

AttributeError: 'dict' object has no attribute '__module__' 

我追踪到问题出在这个代码行,它是在rq库里面的:

 if not isinstance(f, string_types) and f.__module__ == '__main__':
            raise ValueError('Functions from the __main__ module cannot be processed '
                             'by workers.')

我把一个函数作为f传进去,所以我不明白为什么会在一个dict上出现属性错误。有人知道问题出在哪里吗?

错误追踪信息:

  File "/Users/admin/dev/feedme-web/feedme/api/views.py", line 133, in post
    parameter_dict = {
  File "/Users/admin/dev/feedme-web/feedme-env/lib/python2.7/site-packages/django_rq/queues.py", line 162, in enqueue
    return get_queue().enqueue(func, *args, **kwargs)
  File "/Users/admin/dev/feedme-web/feedme-env/lib/python2.7/site-packages/rq/queue.py", line 159, in enqueue
    if not isinstance(f, string_types) and f.__module__ == '__main__':

正在添加到队列的函数:

def create_order_ordrin(user, card_primary_key, address_primary_key):
    parameter_dict = {
      """... pararmeters for call here ..."""
    }
    ordrin = initialize_ordrin()
    return ordrin.order_user(**parameter_dict)

* 注意,值user、card_primary_key和address_primary_key还没有被使用

1 个回答

9

你正在调用一个函数,并把这个函数的结果传递给队列。

你需要先注册这个函数,而不是直接调用它,并且在它被调用时要包含要传递的参数:

django_rq.enqueue(create_order_ordrin, foo, bar=baz)

这样它会被调用为 create_order_ordrin(foo, bar=baz)

撰写回答