2016-12-01 51 views
0

我有一个回调函数,它在收到每条消息时返回AMQP消息的主体。我希望能够将正文的内容分配给全局变量,然后在我的程序中进一步处理它。为什么这个全局变量在Python 2.7中更新,即使我使用全局关键字?

我在脚本的顶部创建了一个全局变量,并且在回调函数中使用了global关键字,我知道应该允许我更新脚本顶部的全局变量,但是当我导入' “从另一个脚本,我得到的原始值‘测试全局变量’返回,而不是身体的从回调函数中的当前值...

Consumer.py

**python/pika imports and credentials go here** 

T_MSG = "test" # create global variable 

def main(): 
    logging.basicConfig() 

    (username, password) = open(CREDENTIALS_FILE).read().splitlines() 
    credentials = pika.PlainCredentials(username, password) 
    params = pika.ConnectionParameters(AMQP_HOST, AMQP_PORT, AMQP_EXCHANGE, credentials) 
    connection = pika.BlockingConnection(params) 

    channel = connection.channel() 

    channel.queue_declare(queue=QUEUE_NAME, durable=False) 

    def callback(ch, method, properties, body): 
     #print "received message: %r" % body 

     global T_MSG # Define that I want to work with the global variable 

     #assert isinstance(body, object) 

     T_MSG = str(body) # assign the value of body to the global variable 

     print T_MSG # this prints out the body as expected 

     return T_MSG 
     #ch.basic_ack(delivery_tag = method.delivery_tag) 

    #channel.basic_qos(prefetch_count=1) 

    channel.basic_consume(callback, queue=QUEUE_NAME, no_ack=False) 
    print 'waiting for new messages on queue: ' 
    channel.start_consuming() 

Importer.py

from consumer import T_MSG 

print T_MSG # this prints the original value of T_MSG e.g. 'Test' 

我不明白为什么T_MSG的值没有从回调函数中更新,因为我可以清楚地看到print语句正在打印body的正确值 - 但即使我已经在callback中声明了全局值函数,当我导入T_MSG的值并尝试打印它时,我得到'Test'的原始赋值,而不是我期望的身体内容...

我的印象是每次回调函数接收到一个消息并'处理'它,正文的新值应该分配给T_MSG(全局)变量,因此我应该能够将其导入到我的importer.py脚本中 - 但这不起作用,我读过的所有东西都只是指出在函数中使用全局关键字来实现这一点...

任何帮助非常感谢!

回答

0

导入之后,您需要调用consumer.main()来获取你的变量变了:

import consumer 
print consumer.T_MSG # here you should see the original value 
consumer.main() 
print consumer.T_MSG # now it will be updated 
+0

谢谢拉夫 - 这工作!我试图在每次收到一个新的主体时更新T_MSG变量的值,而不是仅仅打印它,但我想这也会按需要工作 - 非常感谢您的迅速回复! –

+0

你的module.py似乎是正确的,T_MSG将被更新。这只是您的示例Importer.py,它缺少函数的调用。加载模块时,将加载T_MSG和main(),但不会调用main()或其他任何函数,您必须自己拨打电话。 – Raf

+0

谢谢,这很有道理!我将继续使用接收到的T_MSG(因为这是一个分隔字符串)的分割体,然后我将把这些分量分配给其他变量,然后我将使用它来在我的程序中执行数学和其他事情 - 基本上,我需要能够使用body/T_MSG的内容,以便在接收到新消息时立即更新我的变量值 - 您已经显示的内容应该允许我稍微修改一下 - 非常感谢! –