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

現在の stdout をスレッド内のものにバインドする関数を作成しようとしましたmo.reconnect(sys.__stdout__)が、Pyro4 はバッファを引数として受け入れません。

解決策は、Pyro4 プロキシによって受信される関数の最後に単純にテキストを返すことですが、関数内に情報を表示できるようにしたいと考えています。

質問はstdinにも有効です。

私が探しているものを達成する方法はありますか? 私が得られないものはありますか? おそらく、Pyro4 はそれを行うための最良の方法ではありません。

ありがとうございました

4

1 に答える 1

2

デーモンが stdin および stdout と対話する必要があるのはなぜですか? それがデーモンであるという事実は、それが「ユーザー」(stdin と stdout が意図されている) と対話してはならないことを意味します。

入力と出力を stdin または stdin または out に接続することによって達成したいことにすべてが依存します。

  • ユーザーとの対話が必要な場合は、メイン コードを、そのデーモンが入出力を処理し、デーモンが処理のみを行うプロキシとして機能させる必要があります。つまり、デーモンのインターフェースは、入力文字列 (より簡単な場合はオブジェクト) をパラメーターとして受け取り、プロキシーが受け取ってユーザーに出力する同様のオブジェクトを出力する必要があります。

  • /tmp/sdaemon.logデバッグ出力が必要な場合は、すべてのデーモンの出力が出力されるファイルから直接読み取る簡単なパッチを適用できます (行 44による)。よりまともな修正は、コード全体に適切なログを実装することです。

于 2012-05-21T19:21:10.733 に答える