Повторно подключите запущенный демон к стандартному выходу
-
12-12-2019 - |
Вопрос
У меня есть объект, запущенный как демон в 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).Более достойным решением было бы реализовать правильное ведение журнала по всему вашему коду.