2014-02-05 21 views
0

我正在使用Python構建的大規模嵌入式系統上工作,我們正在使用ZeroMQ將所有模塊化。我有跨越ZeroMQ串行端口發送在Python字典的形式的傳感器數據,如下所示:如何隱藏到Python中的字典

accel_com.publish_message({"ACL_X": ACL_1_X_val}) 

哪裏accel_com是我們建立了一個通訊器類,包裝了通過端口發佈消息的ZeroMQ邏輯。在這裏你可以看到我們正在發送字典。
然而,在通信端口的另一面,我有一個使用此代碼抓住這個數據的另一個模塊:

accel_msg = san.get_last_message("sensor/accelerometer") 
accel.ax = accel_msg.get('ACL_X') 
accel.ay = accel_msg.get('ACL_Y') 
accel.az = accel_msg.get('ACL_Z') 

問題是,當我試圖把accel_msg Python字典,我得到一個錯誤:

'NoneType' object does not have a method 'get()'. 

所以我的猜測是字典沒有正確穿過電線。我對Python不是很熟悉,所以我不知道如何解決這個問題。

+0

錯誤消息說'accel_msg'返回'None'。如在沒有數據的情況下 – mhlester

+0

對ZeroMQ並不十分熟悉,但是如果您在沒有ACL_Y字段的消息上調用accel_msg.get('ACL_Y'),會發生什麼?那會返回'沒有'嗎? –

+0

但現在如果我自己打印'accel_msg',它會打印出這個:'{'timestamp':1391630244.242758,'message_number':9285,'ACL_Z':-267,'module_name':'sensor/accelerometer' }' –

回答

2

擴大對@ JoranBeasley的評論:

accel_msg有時None,如同時它的等待消息。解決方法是跳過None消息

while True:    # waiting indefinitely for messages 
    accel_msg = san.get_last_message("sensor/accelerometer") 
    if accel_msg:  # or more explicitly, if accel_msg is not None: 
     accel.ax = accel_msg.get('ACL_X') 
     accel.ay = accel_msg.get('ACL_Y') 
     accel.az = accel_msg.get('ACL_Z') 
     break   # if you only want one message. otherwise remove this 
    else: 
     print accel_msg # which is almost certainly None 
+0

感謝解釋它:P –

+1

評論太短,不能解釋。有時你只需要*假設*你知道答案和發佈,因此,準備刪除,如果離開基地:) – mhlester

+0

哦,我明白了什麼意味着現在。我沒有意識到會有一些消息是字典和其他是None的。謝謝! –