Форум сайта python.su
0
Здравствуйте.
Хочу сделать, что бы при работе программы она выводила информацию не только в консоль, но и в файл (что-то типа логирования). Как это лучше всего реализовать?
Сначала хотел использовать logging. Но у него какая-то загвоздка: при запуске из PyScripter - он вообще ничего не выводит. А при запуске в консоли - все нормально отображает. Да и не сильно-то мне нужны все те навороты, что там имеются.
В общем хочу я просто заменить все вызовы print на свою функцию printlog.
def printlog (a): print (a) добавление_строки_в_файл(a)
Офлайн
2
def printlog (a): print (a) with open('log.txt', 'a') as logfile: logfile.write(a, '\n')
Офлайн
0
Спасибо. Помогло.
только надо было написать
logfile.write(a + '\n')
Офлайн
20
Я бы не использовал `write` напрямую и не закрывал бы каждый раз лог-файл:
logfile = None logpath = 'log.txt' def printlog(*args): global logfile print(*args) if logfile is None: logfile = open(logpath, 'a') print(*args, file=logfile) #logfile.flush()
Отредактировано bw (Янв. 3, 2014 21:09:41)
Офлайн
253
Используйте logging, наплюйте на pyscripter. У pyscripter проблема с тем, что кажется консолью. На самом деле это не консоль а неизвестно что. https://code.google.com/p/pyscripter/issues/detail?id=685
Есть утилита tie http://www.skrenta.com/rt/man/tie.1.html Она предназначена для решения вашей задачи. Для windows можно поставить cygwin (всего пару гигабайт) и вы получите доступ почти ко всем unix утилитам. :)
Успешного освоения питона.
Офлайн
0
Сделал такой код:
def printlog(*args): global logfile print (time.strftime("%H:%M:%S") + " ", *args) if logfile is None: logfile = open(LOGFILE, 'a') print(time.strftime("%H:%M:%S") + " ", *args, file=logfile)
Отредактировано admiral (Янв. 4, 2014 12:43:12)
Офлайн
2
admiralМожно. logfile будет глобальной переменной снаружи и функция ее увидит.
нельзя ли logfile = open(LOGFILE, ‘a’) вынести из функции
Отредактировано Razor (Янв. 4, 2014 14:32:58)
Офлайн
20
> а ничего туда не пишется
Всё туда пишется, откройте для себя буферизацию. В данном случае как минимум системный присутствует, есть ли у Python – не знаю. Собственно я как бы намекнул одной закомментированой строкой, что чего, а нужно ли, это уже не ко мне.
Или после завершения приложения файл всё ещё пустой? В это трудно поверить.
> вам придется писать каждый раз logfile.close()
И зачем придётся это писать каждый раз? И вы забыли сказать, что в таком случае (если использовать мой код), так же каждый раз придётся писать logfile = None и каждый раз будет срабатывать if logfile is None: … и каждый раз будет открываться один и тот же файл. И зачем я так странно сделал? А, ну да, что бы на 10000 лог-сообщений 10000 раз открывать и 10000 раз закрывать файл.
Зачем дурацкие советы даёте?
За `close` в подавляющем большинстве случаев переживать не нужно, всё там рано или поздно закроется (когда потеряется последняя ссылка на файловый объект). Но вообще про with open(…) знать конечно нужно.
Можно сделать так, если заняться больше нечем:
import atexit logfile = None # ... if logfile is None: logfile = open(...) atexit.register(logfile.close) # ...
Отредактировано bw (Янв. 4, 2014 15:32:10)
Офлайн
0
bwСпасибо. Все заработало.
Всё туда пишется, откройте для себя буферизацию. В данном случае как минимум системный присутствует, есть ли у Python – не знаю. Собственно я как бы намекнул одной закомментированой строкой, что чего, а нужно ли, это уже не ко мне.Или после завершения приложения файл всё ещё пустой? В это трудно поверить.
def printlog(*args): """ Подпрограмма одновременного вывода строки на экран и в файл """ global logfile t = time.strftime("%H:%M:%S") + " " print (t, *args) if logfile is None: try: logfile = open(LOGFILE, 'a') except Exception: print (t, "Не могу открыть лог-файл") else: try: #logfile.write(t + str(*args) + '\n') print(t, *args, file = logfile) logfile.flush() except Exception: print (t, "Не могу добавить строку в лог-файл")
Офлайн
253
:)
admiralВ это с трудом верится.
Вот окончательный вариант:
logfile is None
logfile.flush()
Отредактировано doza_and (Янв. 5, 2014 10:24:50)
Офлайн