Rabbitmq和Python名称错误:全局名称问题

Rabbitmq和Python名称错误:全局名称问题,python,rabbitmq,pika,Python,Rabbitmq,Pika,我正在尝试向Rabbitmq发送JSON。 这是我的制作人,工作正常: import pika import json credentials = pika.PlainCredentials('admin', '123') parameters = pika.ConnectionParameters('192.168.1.11', 5672,

我正在尝试向Rabbitmq发送JSON。 这是我的制作人,工作正常:

import pika
import json

credentials = pika.PlainCredentials('admin', '123')
parameters = pika.ConnectionParameters('192.168.1.11',
                                       5672,
                                       '/',
                                       credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='myapp')

message = {'fname': 'test', 'lname': 'test'}

channel.basic_publish(exchange='',
                      routing_key='myapp',
                      body=json.dumps(message),
                      properties=pika.BasicProperties(
                         delivery_mode = 2,

                      ))
print(" [x] Sent %r" % message)

connection.close()
这是接收器,不正常:

import pika
import time
import json

credentials = pika.PlainCredentials('admin', '123')
parameters = pika.ConnectionParameters('192.168.1.12',
                                       5672,
                                       '/',
                                       credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='myapp')

def callback(ch, method, properties, body):
    myjson = json.loads(body)
    global fname
    global lname
    fname = myjson["fname"]
    lname = myjson["lname"]
    my_func(fname,lname)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='myapp',
                      auto_ack=True,
                      on_message_callback=callback)
channel.start_consuming()
def my_func(fname,lname):
    pass

当我运行脚本时 接收器显示以下问题:


名称错误:未定义全局名称“my_func”

此问题是由于receiver.py中的此函数引起的

channel.start_consuming()

该函数将在那里阻止程序并阻止它查看my_func()。另一方面,代码分析工具(例如pylint)很可能无法检测到此类错误

一个简单的解决方案是将代码更改为

def回调(ch、方法、属性、正文): myjson=json.load(正文) 全局fname 全局lname fname=myjson[“fname”] lname=myjson[“lname”] my_func(fname,lname) 定义我的函数(fname,lname): 通过 通道基本qos(预取计数=1) 通道.基本消费(队列='myapp', 自动确认=真, 打开消息(回调=回调) channel.start_consuming() 更复杂的解决方案是创建自己的类或方法,并以异步方式运行start_consuming()。以下是我的例子:

def侦听(自、交换、路由、回调):
self.ReceiveChannel=self.connection.channel()
使用者\u线程=线程。线程(目标=自身。\u使用者\u,参数=[交换、路由、回调])
consumer_thread.start()

问题是由于receiver.py中的此功能造成的

channel.start_consuming()

该函数将在那里阻止程序并阻止它查看my_func()。另一方面,代码分析工具(例如pylint)很可能无法检测到此类错误

一个简单的解决方案是将代码更改为

def回调(ch、方法、属性、正文): myjson=json.load(正文) 全局fname 全局lname fname=myjson[“fname”] lname=myjson[“lname”] my_func(fname,lname) 定义我的函数(fname,lname): 通过 通道基本qos(预取计数=1) 通道.基本消费(队列='myapp', 自动确认=真, 打开消息(回调=回调) channel.start_consuming() 更复杂的解决方案是创建自己的类或方法,并以异步方式运行start_consuming()。以下是我的例子:

def侦听(自、交换、路由、回调):
self.ReceiveChannel=self.connection.channel()
使用者\u线程=线程。线程(目标=自身。\u使用者\u,参数=[交换、路由、回调])
consumer_thread.start()