在每次加载时,如果没有丑陋的7行logginginginfo,我如何记录IPython的输出?

2024-04-24 17:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是调用ipython,同时将所有输入/输出记录到IPython,并查看如下内容:

stu@stumac ~  $ ipython

In [1]: exit
stu@stumac ~  $

横幅可以很容易地删除,如果我设置

c.TerminalIPythonApp.display_banner = False

在我的 ~/.ipython/profile-default/ipython_config.py文件。在

但我如何在记录信息的同时又能清理一家初创企业呢?

在新安装时,如果我在没有参数的情况下启动IPython,我会看到:

^{pr2}$

如果我在调用IPython时传递一个logfile=logfile.txt参数,我会看到:

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时相同的混乱

如果您能帮助我们正确地做这件事,我们将不胜感激。我可以,如果没有别的改变方向系统标准输出,配置日志记录,然后重置系统标准输出但我希望有一个不那么老套的解决方案。在


Tags: pyiptxtlogfalsedefaultinputobject
2条回答

在查看了IPython源代码之后,即:

似乎要真正实现我想要的完整日志的唯一方法是在初始化日志时重定向或静音。在

我已经创建了一个启动文件:~/.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)

要在没有横幅的情况下进行日志记录,请使用no banner标志。在

ipython  no-banner  logfile='logfile.txt'

这可以在显示有help all标志的帮助文件中找到。在

^{pr2}$

相关问题 更多 >