我如何在 class 方法中调用不同的 class 实例?
How did I call different class instance in a class method?
我正在使用 zerorpc 构建一个 pub-sub NAT 断路器并于昨天完成。现在,我正在尝试修改我的代码,以便使用 Sander Marechal 的 code sample 将 运行 发布者作为守护进程。
这是我的 publisher.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zerorpc
import os, sys, time
from daemon import Daemon
class publisherd(Daemon):
def run(self):
publisher = zerorpc.Publisher()
publisher.bind("tcp://0.0.0.0:8888")
# Start RPC Server
s = LocalForwarder()
s.bind("tcp://0.0.0.0:4242")
s.run()
class LocalForwarder(zerorpc.Server):
def pub(self, domain, testcase_pk, testresult_pk):
print domain, testcase_pk, testresult_pk
publisher.add(domain, testcase_pk, testresult_pk)
print 'Send to dispacher'
if __name__ == "__main__":
daemon = publisherd('/tmp/publisher.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
然后我构建了一个 autosender.py 用于测试
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zerorpc
import os, sys
time = 0
sleep = 10
for i in range(1,10,1):
ts_dispatcher_name = "KS-1"
testsuite_id = i
tr_pk = time
c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")
c.pub(ts_dispatcher_name, testsuite_id, tr_pk)
print ts_dispatcher_name, testsuite_id, tr_pk
time += sleep
os.system("sleep %s" %sleep)
但是我在测试时收到以下错误消息:
File "publisher_d.py", line 21, in pub
publisher.add(domain, testcase_pk, testresult_pk)
NameError: global name 'publisher' is not defined
LocalForwarder 似乎无法识别发布者实例,但我无法弄清楚为什么会出现错误?我该如何纠正这个错误?
您似乎希望 publisher 是一个全局变量。为此,您需要尝试这样的操作:
my_global = None
def x():
global my_global
my_global = 1
def y():
print(my_global)
默认情况下,您创建的 publisher var 在本地作用于该方法——这是赋值时的默认值。 global
关键字允许您在全局范围级别设置该变量。仅引用值的函数不需要 global
关键字。
您必须将发布者实例传递给您的 LocalFowarder
实例,即:
class Publisherd(Daemon):
def run(self):
publisher = zerorpc.Publisher()
publisher.bind("tcp://0.0.0.0:8888")
# Start RPC Server
s = LocalForwarder(publisher)
s.bind("tcp://0.0.0.0:4242")
s.run()
class LocalForwarder(zerorpc.Server):
def __init__(self, publisher, *args, **kw):
super(LocalForwarder, self).__init__(*args, **kw)
self.publisher = publisher
def pub(self, domain, testcase_pk, testresult_pk):
print domain, testcase_pk, testresult_pk
self.publisher.add(domain, testcase_pk, testresult_pk)
print 'Send to dispacher'
我正在使用 zerorpc 构建一个 pub-sub NAT 断路器并于昨天完成。现在,我正在尝试修改我的代码,以便使用 Sander Marechal 的 code sample 将 运行 发布者作为守护进程。
这是我的 publisher.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zerorpc
import os, sys, time
from daemon import Daemon
class publisherd(Daemon):
def run(self):
publisher = zerorpc.Publisher()
publisher.bind("tcp://0.0.0.0:8888")
# Start RPC Server
s = LocalForwarder()
s.bind("tcp://0.0.0.0:4242")
s.run()
class LocalForwarder(zerorpc.Server):
def pub(self, domain, testcase_pk, testresult_pk):
print domain, testcase_pk, testresult_pk
publisher.add(domain, testcase_pk, testresult_pk)
print 'Send to dispacher'
if __name__ == "__main__":
daemon = publisherd('/tmp/publisher.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
然后我构建了一个 autosender.py 用于测试
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zerorpc
import os, sys
time = 0
sleep = 10
for i in range(1,10,1):
ts_dispatcher_name = "KS-1"
testsuite_id = i
tr_pk = time
c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")
c.pub(ts_dispatcher_name, testsuite_id, tr_pk)
print ts_dispatcher_name, testsuite_id, tr_pk
time += sleep
os.system("sleep %s" %sleep)
但是我在测试时收到以下错误消息:
File "publisher_d.py", line 21, in pub
publisher.add(domain, testcase_pk, testresult_pk)
NameError: global name 'publisher' is not defined
LocalForwarder 似乎无法识别发布者实例,但我无法弄清楚为什么会出现错误?我该如何纠正这个错误?
您似乎希望 publisher 是一个全局变量。为此,您需要尝试这样的操作:
my_global = None
def x():
global my_global
my_global = 1
def y():
print(my_global)
默认情况下,您创建的 publisher var 在本地作用于该方法——这是赋值时的默认值。 global
关键字允许您在全局范围级别设置该变量。仅引用值的函数不需要 global
关键字。
您必须将发布者实例传递给您的 LocalFowarder
实例,即:
class Publisherd(Daemon):
def run(self):
publisher = zerorpc.Publisher()
publisher.bind("tcp://0.0.0.0:8888")
# Start RPC Server
s = LocalForwarder(publisher)
s.bind("tcp://0.0.0.0:4242")
s.run()
class LocalForwarder(zerorpc.Server):
def __init__(self, publisher, *args, **kw):
super(LocalForwarder, self).__init__(*args, **kw)
self.publisher = publisher
def pub(self, domain, testcase_pk, testresult_pk):
print domain, testcase_pk, testresult_pk
self.publisher.add(domain, testcase_pk, testresult_pk)
print 'Send to dispacher'