【问题标题】:Python tutorial code from RabbitMQ failing to runRabbitMQ 的 Python 教程代码无法运行
【发布时间】:2018-05-18 05:23:06
【问题描述】:

编辑:我的设备上安装了错误版本的 pika 软件包。我从 pip 更新后它工作正常。

我刚开始通过关注他们的tutorial 学习 RabbitMQ(使用 Python)的用法。 send.py 代码工作正常,但是当我尝试运行 receive.py 时,我看到了这个错误:

Traceback (most recent call last):
  File "receive.py", line 15, in <module>
    no_ack=True)
TypeError: basic_consume() got multiple values for keyword argument 'queue'

这是receive.py里面的代码:

#!/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)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

知道我做错了什么吗?

【问题讨论】:

  • 你能显示你的代码吗?你在哪里使用 basic_consume()
  • 是的,添加了。我以为我不需要,因为它在网站上。对此感到抱歉。
  • @sudhavna 我运行你的代码,它可以工作
  • 您的回溯声称该文件名为receieve.py,您声称其名为receive.py ...确定您正在编辑正确的文件吗?
  • 糟糕。命名我的文件时出现拼写错误。但是,是的,我正在编辑同一个文件。

标签: python rabbitmq


【解决方案1】:

你可能不再需要它了,但我遇到了和你完全相同的问题,这就是我想出来的。

对我来说,事实证明 RabbitMQ 文档一定是使用了不同版本的 pika。我发现在 pika 1.0.0 basic_consume 函数有不同的参数顺序。这是它在我的机器上的样子:

    def basic_consume(self,
                  queue,
                  on_message_callback,
                  auto_ack=False,
                  exclusive=False,
                  consumer_tag=None,
                  arguments=None):

一旦我更改了传递参数的顺序,或者添加了关键字“on_message_callback=callback”,它就全部起作用了。希望对你有帮助!

【讨论】:

    【解决方案2】:

    只是改变

    channel.basic_consume(callback, queue='hello', no_ack=True)
    

    channel.basic_consume('hello', callback, auto_ack=True)
    

    【讨论】:

    • 他们只是在 Pika 0.9.x 和 1.0.x 之间交换了 args 并命名了所有 args 作品:channel.basic_consume(on_message_callback=callback, queue='hello', no_ack=True)
    • 要获得与no_ack=True 相同的行为,我认为您需要auto_ack=False
    【解决方案3】:

    我无法重现您的错误,但我希望在尝试时尽可能简洁。

    一开始我在我的电脑上设置了一个rabbitmq服务器as docker container,为了不污染我的系统:

    $ docker run -d --hostname localhost --name some-rabbit rabbitmq:3
    

    然后我使用检查来查找我的 rabbitmq 容器实际运行的 IPAddress:

    $ docker inspect some-rabbit --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
    172.17.0.2
    

    接下来我使用pipenv在python3中创建一个虚拟环境,其中至少包含pika和依赖项来效仿:

    $ mkdir example && cd example && pipenv --three install pika
    Creating a virtualenv for this project…
    Using /usr/bin/python3 (3.6.5) to create virtualenv…
    

    注意,如果你在安装 pika 时说pipenv --two,这里也可以使用 python 2.7。

    然后使用 pipenv shell 跳转到环境中:

    ~/example$ pipenv shell
    Spawning environment shell (/bin/bash). Use 'exit' to leave.
    

    在那里,我按照example documentation of pika 的建议创建了两个文件send.pyreceive.py,但我将用上面的docker 容器IP 替换localhost

    $ cat send.py 
    #!/usr/bin/env python 
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.17.0.2'))
    channel = connection.channel()
    
    
    channel.queue_declare(queue='hello')
    
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print(" [x] Sent 'Hello World!'")
    connection.close()
    

    还有receive.py

    $ cat receive.py
    #!/usr/bin/env python
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.17.0.2'))
    channel = connection.channel()
    
    
    channel.queue_declare(queue='hello')
    
    def callback(ch, method, properties, body):
        print(" [x] Received %r" % body)
    
    channel.basic_consume(callback,
                          queue='hello',
                          no_ack=True)
    
    print(' [*] Waiting for messages. To exit press CTRL+C')
    channel.start_consuming()
    

    在一个终端中运行 receive.py 并在另一个终端中运行 send.py 按预期工作:

     $ python receive.py 
     [*] Waiting for messages. To exit press CTRL+C
    
     $ python send.py
     [x] Sent 'Hello World!'
    
     $ python receive.py 
     [*] Waiting for messages. To exit press CTRL+C
     [x] Received b'Hello World!
    

    HTH, f3rdy

    【讨论】:

    • 感谢您编写的非常好的教程。原来我安装了错误的 Pika 版本。
    【解决方案4】:

    在我删除库存版本并通过 pip 安装更新版本 pika (1.0.1) 后,我在 Ubuntu 18.04 上使用库存 python-pika 软件包版本 0.11.0-1 遇到了同样的问题,这个问题消失了。

    【讨论】:

      【解决方案5】:

      只是改变

      channel.basic_consume(callback, queue='hello', no_ack=True)
      

      channel.basic_consume(queue='hello', callback, no_ack=True)
      

      因为我发现lib中的代码是。

      【讨论】:

      • def basic_consume(self, queue, on_message_callback, auto_ack=False, exclusive=False, consumer_tag=None, arguments=None):
      • 这不起作用。第二个赞应该没有queue=no_ack 应该是auto_ack,因此,正确的行是:channel.basic_consume('hello', callback, auto_ack=True)
      【解决方案6】:

      此代码可能会有所帮助:

      channel.basic_consume(on_message_callback=callback, queue='hello')
      

      channel.basic_consume(on_message_callback=callback, queue='hello', auto_ack=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 2013-12-04
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多