将Python解释器历史记录导出到文件?

时间:2011-12-07 19:14:55

标签: python

在实际写入文件之前,我会多次使用Python解释器检查变量并逐步执行命令。但是到最后我在解释器中有大约30个命令,并且必须将它们复制/粘贴到文件中才能运行。有没有办法可以将Python解释器历史记录导出/写入文件?

例如

>>> a = 5
>>> b = a + 6
>>> import sys
>>> export('history', 'interactions.py') 

然后我可以打开interactions.py文件并阅读:

a = 5
b = a + 6
import sys

7 个答案:

答案 0 :(得分:23)

如果您喜欢使用交互式会话,

IPython非常有用。例如,对于您的用例,有save命令,您只需输入save my_useful_session 10-20 23将输入行10到20和23保存到my_useful_session.py。 (为了帮助解决这个问题,每一行都以其编号为前缀)

查看文档页面上的视频,快速了解这些功能。

:: OR ::

有一个way来做。将文件存储在〜/ .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

您也可以添加此项以免费获得自动填充功能:

readline.parse_and_bind('tab: complete')

请注意,这仅适用于* nix系统。由于readline仅适用于Unix平台。

答案 1 :(得分:12)

如果您使用的是Linux / Mac并且有readline库,则可以将以下内容添加到文件中并将其导出到.bash_profile中,您将同时拥有完成和历史记录。

# python startup file
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind('tab: complete')
# history file
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter

导出命令:

export PYTHONSTARTUP=path/to/.pythonstartup

这将在〜/ .pythonhistory

中保存您的python控制台历史记录

答案 2 :(得分:5)

以下不是我自己的工作,但坦率地说我不记得我第一次得到它...但是:将以下文件(在GNU / Linux系统上)放在你的主文件夹中(文件名)应该是.pystartup.py):

# 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, e.g. "export PYTHONSTARTUP=/max/home/itamar/.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")
historyTmp = os.path.expanduser("~/.pyhisttmp.py")

endMarkerStr= "# # # histDUMP # # #"

saveMacro= "import readline; readline.write_history_file('"+historyTmp+"'); \
    print '####>>>>>>>>>>'; print ''.join(filter(lambda lineP: \
    not lineP.strip().endswith('"+endMarkerStr+"'),  \
    open('"+historyTmp+"').readlines())[-50:])+'####<<<<<<<<<<'"+endMarkerStr

readline.parse_and_bind('tab: complete')
readline.parse_and_bind('\C-w: "'+saveMacro+'"')

def save_history(historyPath=historyPath, endMarkerStr=endMarkerStr):
    import readline
    readline.write_history_file(historyPath)
    # Now filter out those line containing the saveMacro
    lines= filter(lambda lineP, endMarkerStr=endMarkerStr:
                      not lineP.strip().endswith(endMarkerStr), open(historyPath).readlines())
    open(historyPath, 'w+').write(''.join(lines))

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

atexit.register(save_history)

del os, atexit, readline, rlcompleter, save_history, historyPath
del historyTmp, endMarkerStr, saveMacro

然后你将获得所有带有bash shell的东西(上下箭头导航历史记录,ctrl-r进行反向搜索等等。)

您的完整命令历史记录将存储在位于~/.pyhistory的文件中。

我从小就使用这个,我从来没有遇到过问题。

HTH!

答案 3 :(得分:1)

自提出此问题以来,过去8年中发生了许多变化。

看来,自Python 3.4起,历史记录会作为纯文本文件自动写入~/.python_history

如果您要禁用它或了解更多信息,请查看

当然,正如许多其他人所指出的那样,IPython具有保存,搜索和处理历史记录的强大功能。通过%history?

了解更多信息

答案 4 :(得分:0)

Linux上的Python应该通过readline库提供历史记录支持,请参阅http://docs.python.org/tutorial/interactive.html

答案 5 :(得分:0)

在ipython shell中:

%history 

该命令将打印您在当前python shell中输入的所有命令。

% history -g 

该命令会将记录在python shell中的所有命令打印到相当多的行。

%history -g -f history.log 

将记录的命令与行号一起写入。您可以使用gvim删除感兴趣的命令的固定宽度行号。

答案 6 :(得分:0)

为什么要编写解释器中的代码 到python文件?您使用解释器来测试您的代码,因此您可以在程序中编写相同的代码。或者,您可以创建自己的解释器,将命令保存在文件中。

#shell.py
import code, sys
class Shell(code.InteractiveConsole):
    def write(self, s):
        open("history.cmd", "a").write(f"{s}\n")
        sys.stderr.write(f"{s}")
    def raw_input(self, prompt):
        a = input(prompt)
        open("history.cmd", "a").write(f"{prompt}{a}\n")
        return a
if __name__ == "__main__": # run the program only if runned
    shell = Shell(filename="<stdin>") #you can use your own filename
    shell.interact()

您可以在自己的类中继承该类并创建自己的解释器!