2016-12-01 13 views
0

私は、各メッセージが受信されると、AMQPメッセージの本文を返すコールバック関数を持っています。本文の内容をグローバル変数に代入し、それから私のプログラムでそれを扱うことができるようにしたいと思います。グローバル変数を使用しているにもかかわらず、このグローバル変数がPython 2.7で更新されないのはなぜですか?

スクリプトの先頭にグローバル変数を作成し、コールバック関数内でglobalキーワードを使用していますが、これはスクリプトの上部にあるグローバル変数を更新できるはずですが、テスト「私はの元の値を取得する別のスクリプトからの 『グローバル変数は、』 Importer.py

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() 

...コールバック関数内から体の現在の値ではなく

を返さ

from consumer import T_MSG 

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

私はprintステートメントがbodyの正しい値を出力していることを明確に見ることができるので、T_MSGの値がコールバック関数内から更新されない理由を理解できませんが、コールバック内でグローバルとして宣言しました関数、私はT_MSGの値をインポートし、それを印刷しようとすると、私は期待しているボディの内容ではなく、 'テスト'の最初に割り当てられた値を取得...

私は印象コールバック関数はメッセージを受け取って処理しますが、bodyの新しい値はT_MSG(グローバル)変数に代入されなければなりません。したがって、それをimporter.pyスクリプトにインポートする必要があります。私が読んだことは、関数内でglobalキーワードを使ってこれをそうするように指示するだけです...

ご協力いただきありがとうございます。

答えて

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

はあなたのRafをありがとう - これは動作します!私は新しいボディが受け取られるたびにT_MSG変数の値を更新しようとしていますが、これは必要に応じて動作すると思います。 –

+0

あなたのmodule.pyが正しいようですが、T_MSGが更新されます。関数の呼び出しが欠けていたImporter.pyの例です。モジュールをロードすると、T_MSGとmain()がロードされますが、main()やその他の関数は呼び出されません。自分でコールする必要があります。 – Raf

+0

ありがとうございました!私は今、T_MSG(これは区切られた文字列である)である身体の上でsplitを使うようになります。次に私のプログラム内で数学や他のことをするために使用する他の変数にコンポーネントを割り当てますbody/T_MSGの内容を使用できるようにする必要がありました。新しいメッセージが受信されるとすぐに変数の値が更新されます。私はちょっと変わってこれを行うことができます。 –

関連する問題