0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24

Направление вывода оператора print в файл и на экран одновременно

03.10.2018, 14:32. Показов 4987. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Каким образом осуществить вывод через оператор «print» в файл и на экран одновременно.
В представленном куске кода получается перенаправить печать при помощи sys.stdout в файл-объект, при этом на экран уже ничего не выводится:

Python
1
2
3
import sys
sys.stdout = open('log.txt', 'w')
print ('test')
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2018, 14:32
Ответы с готовыми решениями:

Создайте класс, определяющий некоторый тип вещественых чисел, имеющий конструктор, операторы +,-, *,/ функцию вывода на экран – print.
Создайте класс, определяющий некоторый тип вещественых чисел, имеющий конструктор, операторы +,-, *,/ функцию вывода на экран – print....

Ошибка при перегрузке оператора вывода в файл
Добрый день, есть такой кусок кода: #include <iostream> #include <ostream> using std::ostream; using namespace std; ...

Определить и вывести на экран множество символов входящих одновременно в файл f и файл g
1)определить и вывести на экран множество символов входящих одновременно в файл f и файл g

10
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
03.10.2018, 14:58
Есть такая штука

Python
1
2
3
4
5
6
7
8
import logging
 
level = logging.INFO
format = '%(message)s'
handlers = [logging.FileHandler('filename.log'), logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
 
logging.info('Информация')
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
03.10.2018, 15:43  [ТС]
Но у меня в программе используется для вывода оператор print. Мне все print заменять на logging.info?
Я так понимаю, что вывод через print не записывается в файл, а через logging.info записывается.
То есть можно даже избирательно записывать/не записывать вывод. Так?
Но вот проблема, невозможно выводить через logging.info (a, 'Информация'), то есть два аргумента сразу, a также как закрыть файл log.txt:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
import logging
 
level = logging.INFO
format = '%(message)s'
handlers = [logging.FileHandler('D:\Pythonом_строка\п1\log.txt'), logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
logging.info('Информация')
 
def prin():
    a = 200
    print(a)
    logging.info(a, 'Информация') #не выводит оба аргумента!!!!
    
prin()
 
handlers.close() #не закрывает файл log.txt
Не могли бы Вы пояснить, как работает этот код.
Большое спасибо!
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
03.10.2018, 16:03
Цитата Сообщение от Sador01 Посмотреть сообщение
handlers.close() #не закрывает файл log.txt
Можно сделать так

Python
1
handlers[0].close()
но не нужно, он сам закроется

Цитата Сообщение от Sador01 Посмотреть сообщение
logging.info(a, 'Информация') #не выводит оба аргумента!!!!
Строку формировать можно отдельно

Python
1
2
3
4
5
6
7
def prin():
    a = 200
    print(a)
    message = f'{a}, Информация'
    logging.info(message) #не выводит оба аргумента!!!!
    
prin()
Цитата Сообщение от Sador01 Посмотреть сообщение
То есть можно даже избирательно записывать/не записывать вывод. Так?
Вот так можно менять вывод

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import logging
 
level = logging.INFO
format = '%(message)s'
handlers = [logging.FileHandler('log.txt'),logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
logging.info('Информация')
 
 
def prin():
    a = 200
    print(a)
    message = f'{a}, Информация'
    logging.info(message) #не выводит оба аргумента!!!!
    
prin()
 
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)
 
handlers = [logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
logging.info('Лог')
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.10.2018, 19:45
https://stackoverflow.com/a/5916874
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.10.2018, 22:30
Цитата Сообщение от Sador01 Посмотреть сообщение
невозможно выводить через logging.info (a, 'Информация'), то есть два аргумента сразу
Python
1
2
3
4
5
6
7
8
9
level = logging.INFO
format = '%(message)s %(user)s %(всяко_разно)s'
handlers = [logging.FileHandler('filename.log'), logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
 
logging.info(
    'Информация %s %s %s',1,2,3,
    extra={'user':"Garry","всяко_разно":"Император умер"}
)
Code
1
Информация 1 2 3 Garry Император умер
2
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
04.10.2018, 14:02  [ТС]
Garry Galler,

Добрый день, Garry Galler! Мы могли бы Вы пояснить, как работают следующие строки кода.
Во второй строке (format = …) формируются ключи для словаря extra с ключами user и всяко_разно, при этом ключ message не используется. Это сделано для того чтобы продемонстрировать вариативность записи аргументов для logging.info?

Python
1
2
3
4
5
6
7
8
9
level = logging.INFO 
format = '%(message)s %(user)s %(всяко_разно)s' #с этой строкой более-менее понятно
handlers = [logging.FileHandler('filename.log'), logging.StreamHandler()] #что мы тут делаем, это стандартная запись для этого способа?
logging.basicConfig(level = level, format = format, handlers = handlers) #как работают аргументы в скобках?
 
logging.info(
    'Информация %s %s %s',1,2,3,
    extra={'user':"Garry","всяко_разно":"Император умер"}
)
Спасибо!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.10.2018, 15:02
%(message)s это встроенный именованный ключ, также как и %(asctime)s - для вывода времени в предустановленном формате.
Все встроенные ключи смотрите здесь
Данные для пользовательских ключей\атрибутов передаются в словаре именованного параметра extra.
А сам ключ message, который будет использовать первый аргумент функции вывода (в данном случае - строку "Информвция"), позволяет добавить к строке аргумента дополнительные позиционные аргументы в соответствии с числом спецификаторов формата %s в этой строке ("Информация %s %s %s %s %s %s %s %s",1,2,3,4,5,6,7,8).
P.S. Остальное читайте в документации по модулю logging.
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24
04.10.2018, 15:08  [ТС]
Добрый день, ТабуретY! Мы могли бы Вы пояснить, как работают следующие строки кода избирательной записи вывода в log:
Python
1
2
3
4
5
6
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)
 
handlers = [logging.StreamHandler()]
logging.basicConfig(level = level, format = format, handlers = handlers)
logging.info('Лог') #вывод на экран без записи в log
Спасибо!
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
04.10.2018, 15:35
Цитата Сообщение от Sador01 Посмотреть сообщение
ак работают следующие строки кода избирательной записи вывода в log
В строках 1 и 2 убираем все хендлеры, затем создаем только вывод в консоль и добавляем в basicConfig
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.10.2018, 18:17
Sador01,
Вам нужно научиться манипулировать уровнями сообщений для распределения того, что писать в консоль, а что в файл.
Отключать какие-то конкретные обработчики в logging не самый простой и рекомендуемый путь.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import logging
 
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
formatter = logging.Formatter('%(levelname)s %(message)s %(user)s %(всяко_разно)s')
console = logging.StreamHandler()
console.setLevel(logging.INFO)  # в консоль выводим только INFO и все что выше
console.setFormatter(formatter)
filehandler = logging.FileHandler('filename.log')
filehandler.setLevel(logging.WARNING)  # в файл выводим только WARNING и все что выше
filehandler.setFormatter(formatter)
log.addHandler(console)
log.addHandler(filehandler)
 
# в файл
log.error(
    'Информация %s %s %s',1,2,3,
    extra={'user':"Garry","всяко_разно":"С Императором что-то не так... "}
)
 
# в файл
log.warning(
    'Информация %s %s %s',1,2,3,
    extra={'user':"Garry","всяко_разно":"Император при смерти"}
)
 
log.disabled = True        # отключает все обработчики 
# ничего не будет выведено ни в файл
log.warning(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император умер"}
)
# ни в консоль
log.info(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император умер"}
)
 
 
log.disabled = False   # возвращаем обратно
# в консоль
log.info(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император жив"}
)
 
logging.disable(logging.WARNING) # отключает все сообщения уровня warning и ниже
# это отключено
log.warning(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император возродился"}
)
# это отключено
log.info(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Да здравствует Император!"}
)
# а это нет - так как уровень CRITICAL выше WARNING
log.critical(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Увы, но Император все-таки умер..."}
)
Добавлено через 1 час 38 минут
Update. Есть еще вот такой хак для временного отключения какого-либо обработчика:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
... все обработчики у нас созданы индивидуально и каждый присвоен своей переменной
 
console.setLevel(100)
# отключаем консоль - это сообщение в консоль не попадет
log.info(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император жив"}
)
console.setLevel(logging.INFO) # возвращаем уровень обратно
# теперь снова работает вывод в консоль
log.info(
    'Информация %s %s %s',*(1,2,3),
    extra={'user':"Garry","всяко_разно":"Император жив?"}
)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.10.2018, 18:17
Помогаю со студенческими работами здесь

Вызов прегруженного оператора вывода в поток из аналогичного оператора
Программирую в c9.io с g++ получается тоже самое. Элементами стека(pointList) являются стеки(list) для которых уже определен оператор...

Запись матрицы в файл и вывод на экран одновременно.
Д.д. Необходимо написать программу записи двумерного массива в текстовый файл и вывести на экран записанную матрицу. Вот что у меня...

Вывод stdout запущенного процесса одновременно на экран и в файл
Как сделать, чтобы запущенный при помощи команды Start-Process процесс выводил результат работы и в файл и на экран? Start-Process...

Как перенаправить вывод команды на экран и в файл одновременно?
В общем ситуация такая: есть команда, например date. Необходимо перенаправить ее вывод на экран и в date.txt . Каким образом это...

Перегрузка оператора вывода для вывода нестатических членов класса
Здравствуйте, подскажите, пожалуйста, как реализовать перегрузку оператора вывода для класса, у которого есть свойства, являющиеся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru