Как я могу регистрировать вывод IPython без уродливых 7 строк информации о регистрации при каждой загрузке?

Моя цель - вызвать ipython, а также записывать весь ввод / вывод в IPython и видеть что-то вроде:

stu@stumac ~  $ ipython

In [1]: exit
stu@stumac ~  $

Баннер легко снимается, если установить

c.TerminalIPythonApp.display_banner = False

в моем ~/.ipython/profile-default/ipython_config.py файле.

Но как мне очистить автозагрузку и одновременно вести журнал?

При новой установке, если я запускаю IPython без параметров, я вижу:

sente@og ~ $ ipython
Python 2.7.3 (default, Jun 20 2013, 12:50:58)
Type "copyright", "credits" or "license" for more information.

IPython 0.13.2 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: exit
sente@og ~ $

Если я передаю аргумент logfile=logfile.txt при вызове IPython, я вижу:

sente@og ~ $ ipython --logfile=logfile.txt
Activating auto-logging. Current session state plus future input saved.
Filename       : logfile.txt
Mode           : backup
Output logging : False
Raw input log  : False
Timestamping   : False
State          : active
Python 2.7.3 (default, Jun 20 2013, 12:50:58)
Type "copyright", "credits" or "license" for more information.

IPython 0.13.2 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: exit
sente@og ~ $

Как я могу использовать ведение журнала, не добавляя лишнего беспорядка в мой терминал:

Activating auto-logging. Current session state plus future input saved.
Filename       : logfile.txt
Mode           : backup
Output logging : False
Raw input log  : False
Timestamping   : False
State          : active

На других машинах у меня есть IPython, настроенный для автоматического протоколирования событий, имея .ipython/profile_default/startup/01-log-everything.py, который содержит строки:

from time import strftime
import os.path

ip = get_ipython()

ldir = ip.profile_dir.log_dir
fname = strftime('%Y-%m-%d-%H-%M-%S') + ".py"
filename = os.path.join(ldir, fname)

ip.run_line_magic('logstart', '-o %s append' % filename)

что приводит к тому же беспорядку, что и при добавлении --logfile=logfile.txt

Любая помощь о том, как это сделать, будет оценена по достоинству. Я мог бы, если бы больше ничего не перенаправить sys.stdout, настроить ведение журнала, а затем сбросить sys.stdout, но я надеюсь, что есть менее хакерское решение.


person sente    schedule 27.06.2013    source источник
comment
Здесь был задан аналогичный вопрос: stackoverflow.com/questions/947810   -  person BugoK    schedule 27.06.2013
comment
@BugoK, спасибо - я думаю, вопрос в этом посте немного похож, но то, что я пытаюсь сделать, очень конкретное и не рассматривается в этом посте или где-либо еще, насколько я могу судить.   -  person sente    schedule 28.06.2013


Ответы (2)


Для входа без баннера используйте флаг --no-banner.

ipython --no-banner --logfile='logfile.txt'

Это можно найти в файле справки, отображаемом с флагом --help-all.

ipython --help-all
person user29165    schedule 28.06.2013
comment
Спасибо за отзыв, но я хочу запретить баннер , а также всю информацию для регистрации. Когда вы передаете --logfile='logfile.txt', IPython печатает полдюжины строк материала, который я хочу подавить. - person sente; 24.07.2013

Посмотрев на исходник IPython, а именно:

Кажется, единственный способ добиться того, чего я хочу - завершить регистрацию без каких-либо эхо-сигналов при запуске - это перенаправить или отключить sys.stdout во время инициализации регистрации.

Я создал файл запуска: ~ / .ipython / profile_default / startup / 01-log-everything.py, который делает это, код следующий:

from time import strftime
import os.path
import contextlib
import cStringIO
import sys


# create a context which we can use for any block which we can use for any
# block which we do not want to print stdout
# -- taken from http://stackoverflow.com/a/2829036/217652

@contextlib.contextmanager
def nostdout():
    save_stdout = sys.stdout
    sys.stdout = cStringIO.StringIO()
    yield
    sys.stdout = save_stdout



ip = get_ipython()

ldir = ip.profile_dir.log_dir
fname = strftime('%Y-%m-%d-%H-%M-%S') + ".py"
filename = os.path.join(ldir, fname)


# stdout is now muted
with nostdout():
    ip.run_line_magic('logstart', '-o %s append' % filename)
person sente    schedule 24.07.2013