編集:デバイスに間違ったバージョンの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()
私が間違っていることは何か考えていますか?
あなたはおそらくそれをもう必要としないでしょうが、私はあなたとまったく同じ問題を抱えていました。これが私が理解したことです。
私にとって、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'を追加したりすると、すべてが機能しました。お役に立てば幸いです。
ただ変える
channel.basic_consume(callback, queue='hello', no_ack=True)
に
channel.basic_consume('hello', callback, auto_ack=True)
エラーを再現できませんが、できるだけ簡潔にしたいと思っています。
まず、システムを汚染しないように、コンピューターにrabbitmqサーバー Dockerコンテナーとして をセットアップしました。
$ docker run -d --hostname localhost --name some-rabbit rabbitmq:3
次に、inspectを使用して、実際にrabbitmqコンテナーが実行しているIPアドレスを見つけます。
$ 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シェルを使用して環境にジャンプします。
~/example$ pipenv Shell
Spawning environment Shell (/bin/bash). Use 'exit' to leave.
そこで、 pikaのドキュメントの例 で提案されているように、2つのファイルsend.py
とreceive.py
を作成しますが、localhost
をdockerコンテナ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
ただ変える
channel.basic_consume(callback, queue='hello', no_ack=True)
に
channel.basic_consume(queue='hello', callback, no_ack=True)
libでコードを見つけたので。
在庫のpython-pikaパッケージバージョン0.11.0-1を含むUbuntu 18.04で同じ問題が発生しました。在庫のバージョンを削除し、pipで新しいバージョンのpika(1.0.1)をインストールすると、この問題は解消しました。