четверг, 27 августа 2015 г.

RabbitMQ pika с Python 3

При использовании стандартного модуля pika в окружении Python 3 возникает ошибка

Traceback (most recent call last):
  File "c:\temp\2\receive.py", line 5, in <module>
    host='localhost'))
  File "C:\Users\dnazarov\Python_ve\env34_rabbitmq\lib\site-packages\pika\connec
tion.py", line 361, in __init__
    if host and self._validate_host(host):
  File "C:\Users\dnazarov\Python_ve\env34_rabbitmq\lib\site-packages\pika\connec
tion.py", line 207, in _validate_host
    if not isinstance(host, basestring):
NameError: global name 'basestring' is not defined

Для корректной работы можно использовать модуль python3-pika

pip install python3-pika
Проверено на Python 3.4

Стандартный пример будет выглядеть так.

send.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
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

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

print (' [*] Waiting for messages. To exit press CTRL+C')

def callback(ch, method, properties, body):
    print (" [x] Received %r" % (body,))

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


channel.start_consuming()


2 комментария:

  1. Спасибо!
    Хотя, у меня падало с TypeError: Can't convert 'bytes' object to str implicitly
    в строке
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))

    ОтветитьУдалить
  2. Вопрос - а есть ли способ держать коннект к кролику из pika при условии установки блокирующего соединения? Я так понимаю, что кролик со своей стороны шлёт несколько heartbeat пакетов, на которые приложение не отвечает, если соединение блокирующее, после чего сервер со своей стороны соединение разрывает и отправить уже ничего не возможно без переустановки соединения, а это дорогая операция.

    ОтветитьУдалить