2016-12-01 64 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的內容,以便在接收到新消息時立即更新我的變量值 - 您已經顯示的內容應該允許我稍微修改一下 - 非常感謝! –