Object attribute not recognized by object's functions [Python] -
i'm running strange error.
import socket string_message_converter import stringmessageconverter smc sbe_message_converter import sbemessageconverter 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)
i have main method relies on class. when run connect(), nameerror 'global name 'sock' not defined'. sock not global; attribute define in __init__. weird thing same error not occur p_id. example:
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)
will print '2' p_id (will still break on self.sock in connect before too). moreover, ran same code on different machine , runs fine. why isn't self.sock being recognized?
edit: main method 2 lines.
testmain_pub.py
def main(): f = foo() f.start_process() #references connect method
the stack trace referencing 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)
this might not answer looking for, error elsewhere, not in code show us. take gave , strip down bare minimum , works.
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()
output:
self.sock = <socket._socketobject object @ 0x10f4b91a0>
update
you should take hint @pablodíazogni: problem here: sock.af_inet
, in code not showing us.
Comments
Post a Comment