I find myself frequently using Python's interpreter to work with databases, files, etc -- basically a lot of manual formatting of semi-structured data. I don't properly save and clean up the useful bits as often as I would like. Is there a way to save my input into the shell (db connections, variable assignments, little for loops and bits of logic) -- some history of the interactive session? If I use something like script I get too much stdout noise. I don't really need to pickle all the objects -- though if there is a solution that does that, it would be OK. Ideally I would just be left with a script that ran as the one I created interactively, and I could just delete the bits I didn't need. Is there a package that does this, or a DIY approach?


当前回答

对于那些使用spacemacs和python层附带的ipython的人来说,save magic会创建大量不必要的输出,因为不断的自动补全命令在后台工作,例如:

len(all_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all_substa'''))
len(all_substantives_w_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all'''))
';'.join(__PYTHON_EL_get_completions('''all_'''))
';'.join(__PYTHON_EL_get_completions('''all_w'''))
';'.join(__PYTHON_EL_get_completions('''all_wo'''))
';'.join(__PYTHON_EL_get_completions('''all_wor'''))
';'.join(__PYTHON_EL_get_completions('''all_word'''))
';'.join(__PYTHON_EL_get_completions('''all_words'''))
len(all_words_w_logograms)
len(all_verbs)

为了避免这种情况,只需保存ipython缓冲区,就像通常保存任何其他:spc f一样

其他回答

我想建议另一种在linux上通过tmux维护python会话的方法。运行tmux,将自己附加到所打开的会话(如果直接打开后没有附加)。执行python并在它上做任何事情。然后从会话中分离。从tmux会话分离并不会关闭会话。会议仍然开放。

这种方法的优点: 您可以从任何其他设备连接到此会话(如果您可以SSH您的pc)

这种方法的缺点: 在python解释器真正存在之前,此方法不会放弃被打开的python会话所使用的资源。

有%history魔法用于打印和保存输入历史记录(可选的还有输出)。

将当前会话存储到my_history.py文件中:

>>> %hist -f my_history.py

History IPython存储您输入的命令和它产生的结果。您可以使用上下方向键轻松地浏览以前的命令,或者以更复杂的方式访问历史记录。

您可以使用%history神奇函数来检查过去的输入和输出。以前会话的输入历史保存在数据库中,可以配置IPython以保存输出历史。

其他几个神奇的功能可以使用您的输入历史,包括%编辑,%重新运行,%召回,%宏,%保存和%pastebin。你可以使用标准格式来引用行:

%pastebin 3 18-20 ~1/1-5

这将占用当前会话中的第3行和第18 - 20行,以及前一会话中的第1-5行。

看到%历史吗?查看Docstring和更多示例。

另外,一定要探索%store magic在IPython中实现变量轻量级持久性的功能。

在IPython的数据库中存储变量、别名和宏。

d = {'a': 1, 'b': 2}
%store d  # stores the variable
del d

%store -r d  # Refresh the variable from IPython's database.
>>> d
{'a': 1, 'b': 2}

要在启动时自动恢复存储的变量,ipython_config.py中的specificc . storemagic .autorestore = True。

%history命令非常棒,但不幸的是,它不能让您将%paste 'd保存到sesh中。要做到这一点,我认为你必须在开头执行%logstart(尽管我还没有确认这是有效的)。

我喜欢做的是

%history -o -n -p -f filename.txt

它将在每个输入(o, n和p选项)之前保存输出,行号和'>>>'。请在这里查看文档中的%history。

有一种方法可以做到。将文件存储在~/.pystartup…

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

然后在shell中设置环境变量PYTHONSTARTUP(例如在~/.bashrc中):

export PYTHONSTARTUP=$HOME/.pystartup

你也可以添加这个来获得免费的自动补全:

readline.parse_and_bind('tab: complete')

请注意,这只适用于*nix系统。因为readline只在Unix平台上可用。

除了IPython之外,类似的实用程序bpython还有一个“将您输入的代码保存到文件中”的特性