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?
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!
il suffit de changer
channel.basic_consume(callback, queue='hello', no_ack=True)
à
channel.basic_consume('hello', callback, auto_ack=True)
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
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.
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.