web-dev-qa-db-fra.com

Python code du didacticiel de RabbitMQ ne s'exécutant pas

Edit: La mauvaise version du paquet pika était installée sur mon appareil. Cela fonctionne bien après avoir mis à jour depuis pip.

Je viens de commencer à apprendre l'utilisation de RabbitMQ (en utilisant Python) en suivant leur tutoriel . Le send.py le code fonctionne bien mais quand j'essaye d'exécuter receive.py, Je vois cette erreur:

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'

Voici le code à l'intérieur 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()

Une idée de ce que je fais mal?

6
sudhanva

Vous n'en avez probablement plus besoin, mais j'ai eu exactement le même problème que vous et c'est ce que j'ai compris.

Pour moi, il s'est avéré que la documentation RabbitMQ devait utiliser une version différente de pika. J'ai découvert que dans pika 1.0.0, la fonction basic_consume a un ordre d'arguments différent. Voici à quoi cela ressemble sur ma machine:

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

Une fois que j'ai changé l'ordre des arguments passés ou ajouté le mot clé 'on_message_callback = callback', tout a fonctionné. J'espère que ça aide!

13
Piotr Wieleba

il suffit de changer

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

à

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

Je ne peux pas reproduire votre erreur, mais je veux être aussi concis que possible lorsque j'essaie de le faire.

Au début, j'ai installé un serveur rabbitmq comme conteneur docker sur mon ordinateur, pour ne pas polluer mon système:

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

Ensuite, j'utilise inspect pour trouver l'adresse IP que mon conteneur rabbitmq exécute réellement:

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

Ensuite, j'utilise pipenv pour créer un environnement virtuel en python3 qui contient au moins pika et des dépendances pour suivre l'exemple:

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

Notez que vous pouvez également utiliser python 2.7 ici si vous dites pipenv --two lors de l'installation de pika.

Sautez ensuite dans l'environnement à l'aide de pipenv Shell:

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

Là, je crée les deux fichiers send.py et receive.py comme proposé par le exemple de documentation de pika , mais je remplacerai le localhost par l'IP des conteneurs docker ci-dessus:

$ 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()

Et 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()

Le fait de recevoir.py dans un terminal et d'exécuter send.py dans un autre fonctionne comme prévu:

 $ 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

1
ferdy

il suffit de changer

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

à

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

parce que j'ai trouvé le code dans lib is.

0
jiangbo liu

J'ai eu le même problème sur Ubuntu 18.04 avec la version 0.11.0-1 du package python-pika en stock, après avoir supprimé la version en stock et installé une version plus récente pika (1.0.1) par pip, ce problème a disparu.

0
Shengyao Xue