web-dev-qa-db-ja.com

Python RabbitMQのチュートリアルコードが実行に失敗する

編集:デバイスに間違ったバージョンの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()

私が間違っていることは何か考えていますか?

6
sudhanva

あなたはおそらくそれをもう必要としないでしょうが、私はあなたとまったく同じ問題を抱えていました。これが私が理解したことです。

私にとって、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'を追加したりすると、すべてが機能しました。お役に立てば幸いです。

13
Piotr Wieleba

ただ変える

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

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

エラーを再現できませんが、できるだけ簡潔にしたいと思っています。

まず、システムを汚染しないように、コンピューターに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.pyreceive.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

1
ferdy

ただ変える

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

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

libでコードを見つけたので。

0
jiangbo liu

在庫のpython-pikaパッケージバージョン0.11.0-1を含むUbuntu 18.04で同じ問題が発生しました。在庫のバージョンを削除し、pipで新しいバージョンのpika(1.0.1)をインストールすると、この問題は解消しました。

0
Shengyao Xue