2015-06-19 93 views
-2

我遇到了一個奇怪的錯誤。對象功能無法識別的對象屬性[Python]

import socket 
from string_message_converter import StringMessageConverter as SMC 
from sbe_message_converter import SBEMessageConverter 
from abstract_publisher import AbstractFoo 
import config 
class Foo(AbstractFoo): 

    def __init__(self, p_id): 
     self.sock = 1 
     self.p_id = p_id 

    def connect(self): 
     ttl = 2 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl) 

我有一個依賴於這個類的主要方法。當我運行connect()時,我得到一個NameError'全局名'sock'未定義'。但襪子不是全球性的;它是我在__init__中定義的屬性。奇怪的是,p_id不會發生同樣的錯誤。例如:

MulticastPublisher.py:

class Foo(AbstractFoo): 

     def __init__(self, p_id): 
      self.sock = 1 
      self.p_id = p_id 

     def connect(self): 
      ttl = 2 
      self.p_id = 2 
      print self.p_id 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
      self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl) 

將打印 '2' 的p_id(之前也對連接的self.sock仍將突破)。而且,我在不同的機器上運行相同的代碼,運行良好。爲什麼self.sock不被識別?

編輯:主要方法只是兩行。

testmain_pub.py

def main(): 

    f = Foo() 
    f.start_process() #references connect method 

堆棧跟蹤只是引用連接方法:

File "testmain_pub.py", line 21, in <module> 
    main() 
    File "testmain_pub.py", line 9, in main 
    m.publish_start("start message") 
    File "/home/observe_and_report/multicast_publisher.py", line 48, in publish_start 
    self.publish("start", message) 
    File "/home/observe_and_report/multicast_publisher.py", line 35, in publish 
    self.connect() 
    File "/home/observe_and_report/multicast_publisher.py", line 30, in connect 
    self.sock = socket.socket(sock.AF_INET, socket.SOCK_DGRAM) 
+0

你可以把完整的代碼示例包括主? –

+3

完整的堆棧跟蹤也是非常有用的。 – user2357112

+0

我相信錯誤是**全局名稱'套接字'未定義**,而不是** sock **。您需要在腳本的開頭添加一行說'import socket'的行。 –

回答

0

這可能不是你要找的答案,但你的錯誤是在其他地方,而不是在您向我們展示的代碼。我只是把你給的東西拿下來,剝離到最低限度,一切正常。

import socket 

class AbstractFoo: 
    pass 

class Foo(AbstractFoo): 
    def __init__(self, p_id): 
     self.sock = 1 
     self.p_id = p_id 

    def connect(self): 
     ttl = 2 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     print 'self.sock =', self.sock 
     self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl) 

def main(): 
    f = Foo(123) 
    f.connect() 

if __name__ == '__main__': 
    main() 

輸出:

self.sock = <socket._socketobject object at 0x10f4b91a0> 

更新

你應該採取暗示從@PabloDíazOgni:問題就在這裏:sock.AF_INET,這是在您沒有顯示我們的代碼。

+0

感謝您的回答。問題實際上是在socket.AF_INET中輸入錯誤。在運行在putty中的代碼中(它遇到問題),我有一個錯字,而不是socket.AF_INET,我寫了sock.AF_INET。我由於某種原因無法從膩子中複製,所以我從我的另一臺機器上覆製出來,認爲它們是相同的代碼。 –

+0

所有學分應該去@PabloDíazOgni –