Код учебника по Python от RabbitMQ не работает - PullRequest
0 голосов
/ 18 мая 2018

Редактировать: На моем устройстве установлена ​​неверная версия пакета pika.Он прекрасно работает после обновления с pip.

Я только начал изучать использование 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()

ЛюбойПонятие, что я делаю не так?

Ответы [ 5 ]

0 голосов
/ 27 мая 2019

У меня возникла такая же проблема в Ubuntu 18.04 с пакетом python-pika версии 0.11.0-1, который есть в наличии, после того, как я удалил версию, выпущенную в наличии, и установил более новую версию pika (1.0.1) с помощью pip, этопроблема исчезла.

0 голосов
/ 24 мая 2019

просто изменить

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

на

channel.basic_consume('hello', callback, auto_ack=True)
0 голосов
/ 08 января 2019

просто измените

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

на

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

, потому что я нашел код в lib:

0 голосов
/ 29 марта 2019

Возможно, вам это больше не нужно, но у меня была точно такая же проблема, как и у вас, и это то, что я понял.

Для меня оказалось, что документация RabbitMQ, должно быть, использовала другуюверсия пика.Я обнаружил, что в 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', все это заработало.Надеюсь, это поможет!

0 голосов
/ 18 мая 2018

Я не могу воспроизвести вашу ошибку, но я хочу быть максимально лаконичным при попытке.

Сначала я настроил сервер rabbitmq в качестве док-контейнера на моемкомпьютер, чтобы не загрязнять мою систему:

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

Затем я использую inspect для определения IP-адреса, на котором фактически работает мой контейнер rabbitmq:

$ 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…

Обратите внимание, что вы также можете использовать Python 2.7 здесь, если вы скажете pipenv --two при установке pika.

Затем перейдите в среду, используя оболочку pipenv:

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

Там я создаю два файла send.py и receive.py, как предложено в примере документации pika * 1025.*, но я заменим localhost на IP-адрес док-контейнеров сверху:

$ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...