2013-06-27 21 views
7

Moim celem jest wywołanie ipython, a także zalogowaniu wszystkie wejścia/wyjścia do ipython i zobaczyć coś takiego:Jak mogę logować dane wyjściowe IPythona bez brzydkich 7 linii informacji logowania na każdym ładowaniu?

[email protected] ~ $ ipython 

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

Banner mogą być łatwo usunięte, jeśli mogę ustawić

c.TerminalIPythonApp.display_banner = False

w mój plik ~/.ipython/profile-default/ipython_config.py.

Ale jak mogę uzyskać to czyste od uruchamiania, a także rejestrowanie rzeczy?

Na nową instalację, jeśli zacznę ipython bez parametrów widzę:

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

Jeśli mijam logfile=logfile.txt argumentu przy wywołaniu ipython widzę:

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

Jak mogę używać logowanie bez dodawania dodatkowego bałaganu do mojego terminala:

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 

na innych maszynach mam ipython skonfigurowany do automatycznego rzeczy zalogować przez posiadające .ipython/profile_default/startup/01-log-everything.py który zawiera wiersze:

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) 

co skutkuje tym samym bałaganu jak kiedy dodać --logfile=logfile.txt

jakiejkolwiek pomocy, jak prawidłowo zrobić to byłoby docenione. Mógłbym, jeśli nic innego, przekierować sys.stdout, skonfigurować rejestrowanie, a następnie zresetować sys.stdout, ale mam nadzieję, że jest mniej hackish rozwiązanie.

+0

Podobny pytano tutaj: http: // stackoverflow.com/questions/947810 – BugoK

+0

@BugoK, dzięki - pytanie w tym poście jest trochę podobne, ale myślę, że to, co próbuję zrobić, jest bardzo specyficzne i nie jest adresowane w tym poście ani nigdzie indziej, najlepiej jak mogę. –

Odpowiedz

4

Po patrząc na źródło ipython, a mianowicie:

Wydaje się, że jedynym sposobem, aby rzeczywiście osiągnąć to, co chcę - kompletne rejestrowanie bez nic echo'd przy uruchomieniu - jest przekierowanie lub wyciszenie sys.stdout podczas inicjowania rejestrowania.

Utworzyłem plik startowy: ~/.ipython/profile_default/startup/01-log-everything.py który robi to, kod jest:

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

Aby logować się bez banera, użyj flagi --no-banner.

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

Można go znaleźć w pliku pomocy wyświetlanym z flagą --help-all.

ipython --help-all 
+0

Dzięki za informację zwrotną, ale chcę zapobiec banerowi * oraz * wszystkim informacjom logowania. Kiedy przekazujesz '--logfile = 'logfile.txt'', IPython wypisuje pół tuzina linii rzeczy, które chcę stłumić. –