0

我有一个对象在 py3k 中作为守护进程运行。为此,我在线程中使用Pyro4模块(基于Sander Marechal的代码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__)函数来将当前标准输出绑定到线程中的标准输出,但 Pyro4 不接受缓冲区作为参数。

一个解决方案可能是在我的函数末尾简单地返回文本,该文本将由 Pyro4 代理接收,但我也希望能够在函数内显示信息。

这个问题也适用于标准输入。

有没有办法实现我正在寻找的东西?有什么我没有得到并且我过于复杂的东西吗?也许 Pyro4 不是最好的方法。

谢谢

4

1 回答 1

2

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

一切都取决于您希望通过将其输入和输出连接到标准输入或输出来实现的目标:

  • 如果你想要用户交互,你应该让你的主代码充当处理输入和输出的守护进程的代理,而守护进程只是做处理。即你的守护进程的接口应该将输入字符串(或对象,如果更容易的话)作为参数,并输出你的代理将接受并输出给用户的类似对象。

  • 如果你想调试输出,一个快速的补丁是直接从/tmp/sdaemon.log所有守护进程输出所在的文件中读取(根据第 44 行)。一个更体面的解决方法是在整个代码中实现正确的日志记录。

于 2012-05-21T19:21:10.733 回答