RabbitMQ Python教程receive.py运行报错及解决(pika版本问题)
Hey there! Glad you got it sorted out by updating your pika package—let me explain exactly why that error happened, in case you run into similar version-related quirks later.
错误原因:pika版本之间的参数签名变化
The TypeError you saw is all about conflicting parameter orders between different pika versions:
- 旧版pika(比如0.10.x及更早):
basic_consume()的第一个参数是queue,回调函数是通过on_message_callback关键字参数传入的。 - 新版pika(1.0+,也就是官方教程基于的版本):
basic_consume()的第一个参数直接是回调函数,queue变成了后续的关键字参数。
你的代码是按照新版教程写的,把callback放在了第一个位置,同时又显式传了queue='hello'。但你之前装的旧版pika会把第一个位置参数当成queue,再加上你传的queue='hello'关键字参数,就导致同一个参数被传了两次,所以抛出got multiple values for keyword argument 'queue'的错误。
两种可行的解决办法
升级pika到最新版本(你已经成功这么做了)
运行这条命令就能完成升级:pip install --upgrade pika升级后,你的原有代码就和新版本的参数签名匹配,自然能正常运行。
如果要保留旧版pika,调整参数写法
把queue作为第一个位置参数,回调函数用on_message_callback指定,修改后的代码如下:#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(" [x] Received %r" % body) # 适配旧版pika的写法 channel.basic_consume(queue='hello', on_message_callback=callback, no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
总结
这个问题完全是pika版本迭代带来的参数签名变化导致的,官方教程始终基于最新稳定版更新,所以更新pika包是最直接的解决方式,也能保证你后续跟着教程学习时不会再遇到类似版本不兼容的问题。
内容的提问来源于stack exchange,提问作者sudhanva

