LINUX.ORG.RU

python перехват чужих print

 


1

1

Допустим есть такой код:

def my():
    print("some my text")

x = my()

print(x)
Результат:
some my text
None

Как можно в переменной «x» получить то что функция выдавала в print?

Зная наперёд что КО предложит мне заменить print на return, скажу что я хочу перехватывать print'ы чужих модулей, и я очень не хочу залезать в каждый и там что-то менять.


import inspect


storage = {}
original_print = print

def interceptor(*args, **kwargs):
    caller_name = inspect.stack()[1][3]
    storage.setdefault(caller_name, []).append((args, kwargs))
    original_print(*args, **kwargs)


print = interceptor

import other_modules
iSlava
()
Ответ на: комментарий от anonymous

Как тогда решить задачу? Я хочу в свой внутренний лог перехватывать всё что летит в консоль

rubro
() автор топика
Ответ на: комментарий от iSlava

естественно, будет работать только в python3, тк там принт это функция, а в 2 - выражение языка.
а еще - скажи мне что ты делаешь, и я скажу почему ты это делаешь неправильно.

iSlava
()
Ответ на: комментарий от iSlava

Большое спасибо за ответы!

Работаю с сетевой библиотекой, мне надо в своём логе видеть запросы который я делаю и результаты их выполнения/ошибки. Изначально автор предлагает такой способ отладки, но мне он не подходит так как у меня есть свой внутренний лог где я естественным языком пишу ход работы.

rubro
() автор топика

Как вариант ещё stdout перехватить.

Kilte ★★★★★
()

Можно заменить sys.stdout на свой file-like объект, но я бы рассматривал это как временное решение.

AlexKiriukha ★★★★
()
Ответ на: комментарий от rubro

Я хочу в свой внутренний лог перехватывать всё что летит в консоль

Вангую, что оно летит в консоль не от принта, а от логера. Поэтому имеем классический XY. Если ты нубас, не умничай, а просто спроси про изначальную проблему, блжад.

anonymous
()

print(«some my text»)

Тут return же должен быть, нет?

alozovskoy ★★★★★
()

Я в ruby делаю так:

  $stdout.reopen('stdout.log', 'w')
  $stderr = $stdout

Полагаю, в питоне есть что-то подобное.

UPD. Первые же ссылки в гугле:
http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python
http://stackoverflow.com/questions/1956142/how-to-redirect-stderr-in-python

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 2)
Ответ на: комментарий от anonymous

А в 3.4 уже даже в стандартной библиотеке есть contextlib.redirect_stdout

anonymous
()

Звучит как код на PHP.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.