Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 24

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

03.10.2018, 14:32. Показов 4935. Ответов 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 / 3205 / 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 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru