我有一个对象在py3k中作为守护进程运行。 为此,我在一个线程中使用Pyro4模块(来自Sander Marechal的on the code,daemon.py)。
class MyDaemon(Daemon):
def run(self):
mo = MyObject()
daemon = Pyro4.Daemon(host=HOST, port=PORT)
uri = daemon.register(mo, USER)
logging.debug("MyObject ready. Object uri = {0}".format(uri))
daemon.requestLoop()
并在需要时,我用
获取对象mo = Pyro4.Proxy("PYRO:%s@%s:%i" % (USER, HOST, PORT))
mo.myAction(my_args)
现在我希望MyObject模块将文本输出到sdtout。问题是,在线程中运行时,它没有连接到sys.__stdout__
。
class MyObject():
def greeting(self):
print("Hello world") # lost
我尝试创建一个mo.reconnect(sys.__stdout__)
函数来将当前stdout绑定到线程中的那个,但是Pyro4不接受缓冲区作为参数。
解决方案可能只是在我的函数末尾返回文本,这将由Pyro4代理接收,但我也希望能够在函数内显示信息。
这个问题对stdin也有效。
有没有办法实现我想要的东西?有没有我得不到的东西,我太复杂了?也许Pyro4不是最好的方法。
谢谢
答案 0 :(得分:2)
为什么你希望你的守护进程与stdin和stdout交互?它是一个守护进程的事实意味着它不应该与“用户”(stdin和stdout的目的)进行交互。
通过将输入和输出连接到stdin或out:
,一切都取决于您想要实现的目标如果您想要用户交互,您应该使主代码充当该守护进程处理输入和输出的代理,并且守护进程只是进行处理。即您的守护进程的接口应该将输入字符串(或更简单的对象)作为参数,并输出代理将采取并输出给用户的类似对象。
如果您想要调试输出,快速补丁将直接从/tmp/sdaemon.log
文件中读取,该文件是所有守护程序输出的所有文件(根据line 44)。更合适的解决方法是在整个代码中实施proper logging。