RabbitMQ的Python教程代码无法运行

时间:2018-05-18 05:23:07

标签: python rabbitmq

修改:我的设备上安装了错误的pika包版本。从pip更新后,它工作正常。

我刚刚开始学习使用RabbitMQ(使用Python)tutorialsend.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()

知道我做错了吗?

6 个答案:

答案 0 :(得分:6)

您可能不再需要它了,但是我遇到了与您完全相同的问题,这正是我所想的。

对我来说,事实证明,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”,它便全部起作用。希望对您有所帮助!

答案 1 :(得分:2)

只是改变

#include <httpserver.hpp>
using namespace httpserver;

class hello_world_resource : public http_resource 
{
    public:
    const std::shared_ptr<http_response> render(const http_request&) 
    {
        return std::shared_ptr<http_response>(new 
        string_response("Hello, World!"));
    }
};

int main() 
{
     webserver ws = create_webserver(8080)
         .use_ssl()
         .https_mem_key("/path/to/abcd.key")
        .https_mem_cert("/path/to/xyz.crt");

        hello_world_resource hwr;
        ws.register_resource("/hello", &hwr);
        ws.start(true);

    return 0;
}

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

答案 2 :(得分:1)

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

首先,我在计算机上设置了一个rabbitmq服务器as docker container,而不是污染我的系统:

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

然后我使用inspect来查找我的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…

注意,如果你在安装鼠兔时说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:< / p>

$ 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

答案 3 :(得分:0)

只是改变

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

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

因为我发现lib中的代码是

答案 4 :(得分:0)

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

答案 5 :(得分:0)

此代码可能有帮助:

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

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