2013-06-27 1 views
7

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

[email protected] ~ $ ipython 

In [1]: exit 
[email protected] ~ $ 

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

c.TerminalIPythonApp.display_banner = False

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

Но как я могу получить эту чистку от запуска, а также регистрировать вещи?

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

[email protected] ~ $ 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 
[email protected] ~ $ 

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

[email protected] ~ $ 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 
[email protected] ~ $ 

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

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, но я надеюсь, что есть менее хакерское решение.

+0

Аналогичный вопрос был задан здесь: Http: // StackOverflow.com/questions/947810 – BugoK

+0

@BugoK, спасибо - вопрос в этом посте немного похож, я думаю, но то, что я пытаюсь сделать, очень специфично и не рассматривается в этом сообщении или где-либо еще, насколько я могу судить. –

ответ

4

После просмотра у источника IPython, а именно:

кажется единственный способ действительно добиться того, что я хочу - полное протоколирование без что-либо echo'd при запуске - это перенаправление или отключить 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) 
4

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

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

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

ipython --help-all 
+0

Спасибо за отзыв, но я хочу предотвратить баннер *, а также * всю информацию о регистрации. Когда вы передаете '--logfile = 'logfile.txt'', IPython печатает полдюжины строк, которые я хочу подавить. –