将正在运行的守护程序重新连接到stdout

时间:2012-05-21 10:14:43

标签: python multithreading python-3.x stdout pyro

我有一个对象在py3k中作为守护进程运行。 为此,我在一个线程中使用Pyro4模块(来自Sander Marechal的on the codedaemon.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不是最好的方法。

谢谢

1 个答案:

答案 0 :(得分:2)

为什么你希望你的守护进程与stdin和stdout交互?它是一个守护进程的事实意味着它不应该与“用户”(stdin和stdout的目的)进行交互。

通过将输入和输出连接到stdin或out:

,一切都取决于您想要实现的目标
  • 如果您想要用户交互,您应该使主代码充当该守护进程处理输入和输出的代理,并且守护进程只是进行处理。即您的守护进程的接口应该将输入字符串(或更简单的对象)作为参数,并输出代理将采取并输出给用户的类似对象。

  • 如果您想要调试输出,快速补丁将直接从/tmp/sdaemon.log文件中读取,该文件是所有守护程序输出的所有文件(根据line 44)。更合适的解决方法是在整个代码中实施proper logging