Повторно подключите запущенный демон к стандартному выходу

StackOverflow https://stackoverflow.com//questions/10683356

Вопрос

У меня есть объект, запущенный как демон в py3k.Для этого я использую Пиро4 модуль внутри потока (на основе о коде от Сандера Марешаля, 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, но я также хочу иметь возможность отображать информацию внутри функции.

Этот вопрос также актуален для stdin.

Есть ли способ достичь того, что я ищу?Есть ли что-то, чего я не понимаю, и я слишком все усложняю?Возможно, Pyro4 - не лучший способ сделать это.

Спасибо

Это было полезно?

Решение

Почему вы хотите, чтобы ваш демон взаимодействовал с stdin и stdout?Сам факт, что это демон, означает, что он не должен взаимодействовать с "пользователем" (для которого предназначены stdin и stdout).

Все зависит от того, чего вы хотите достичь, подключив его вход и выход к стандартному входу или выходу out:

  • Если вы хотите взаимодействия с пользователем, вы должны заставить свой основной код действовать как прокси-сервер для этого демона, обрабатывающего ввод и вывод, а демон просто выполняет обработку.т.е.интерфейс вашего демона должен принимать входные строки (или объекты, если проще) в качестве параметров и выводить аналогичные объекты, которые ваш прокси-сервер будет принимать и выводить пользователю.

  • Если вам нужен вывод отладки, быстрым исправлением было бы считывание непосредственно из /tmp/sdaemon.log файл, в который поступают все выходные данные демона (в соответствии с строка 44).Более достойным решением было бы реализовать правильное ведение журнала по всему вашему коду.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top