如何保存 Python 交互会话?
- 2025-02-18 09:23:00
- admin 原创
- 99
问题描述:
我发现自己经常使用 Python 的解释器来处理数据库、文件等——基本上是大量手动格式化半结构化数据。我没有像我希望的那样经常正确地保存和清理有用的部分。有没有办法将我的输入保存到 shell 中(数据库连接、变量赋值、小 for 循环和逻辑部分)——一些交互式会话的历史记录?如果我使用类似的东西,script
我会得到太多的标准输出噪音。我实际上不需要腌制所有对象——但如果有解决方案可以做到这一点,那就没问题了。理想情况下,我只留下一个以我以交互方式创建的脚本运行的脚本,我可以删除我不需要的部分。有没有可以做到这一点的包,或者 DIY 方法?
解决方案 1:
如果您喜欢使用交互式会话, IPython非常有用。例如,对于您的用例,有一个%save
神奇的命令,您只需输入%save my_useful_session 10-20 23
即可将输入行 10 到 20 和 23 保存到my_useful_session.py
(为了帮助实现这一点,每行都以其编号为前缀)。
此外,文档指出:
此函数使用与%history相同的语法来输入范围,然后将行保存到您指定的文件名。
例如,这允许引用较旧的会话,例如
%save current_session ~0/
%save previous_session ~1/
查看演示页面上的视频可以快速了解其功能。
解决方案 2:
摘自安德鲁·琼斯的网站(存档):
import readline
readline.write_history_file('/home/ahj/history')
解决方案 3:
有一种方法可以做到。将文件存储在~/.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
然后PYTHONSTARTUP
在 shell 中设置环境变量(例如~/.bashrc
):
export PYTHONSTARTUP=$HOME/.pystartup
您还可以添加此项以免费获得自动完成功能:
readline.parse_and_bind('tab: complete')
请注意,这只适用于 *nix 系统。因为 readline 仅在 Unix 平台上可用。
解决方案 4:
如果你使用IPython,你可以使用带有-f参数的魔法函数%history将所有先前的命令保存到文件中,例如:
%history -f /tmp/history.py
解决方案 5:
安装Ipython后,通过运行以下命令打开 Ipython 会话:
ipython
从命令行,只需运行以下 Ipython“magic”命令即可自动记录整个 Ipython 会话:
%logstart
这将创建一个唯一命名的 .py 文件并存储您的会话以供以后用作交互式 Ipython 会话或在您选择的脚本中使用。
解决方案 6:
此外,reinteract还为您提供了类似笔记本的 Python 会话界面。
解决方案 7:
除了 IPython 之外,类似的实用程序bpython 也具有“将输入的代码保存到文件”功能
解决方案 8:
我不得不努力寻找答案,因为我对 iPython 环境还很陌生。
这将有效
如果你的 iPython 会话如下所示
In [1] : import numpy as np
....
In [135]: counter=collections.Counter(mapusercluster[3])
In [136]: counter
Out[136]: Counter({2: 700, 0: 351, 1: 233})
如果你想保存从 1 到 135 行,那么在同一个 ipython 会话中使用此命令
In [137]: %save test.py 1-135
这会将所有 python 语句保存在当前目录(启动 ipython 的位置)中的 test.py 文件中。
解决方案 9:
有 %history 魔法用于打印和保存输入历史记录(以及可选的输出)。
要将当前会话存储到名为的文件中my_history.py
:
>>> %hist -f my_history.py
历史记录 IPython 会存储您输入的命令及其生成的结果。您可以使用上下箭头键轻松浏览以前的命令,或者以更复杂的方式访问历史记录。
您可以使用 %history 魔法函数来检查过去的输入和输出。以前会话的输入历史记录保存在数据库中,并且可以配置 IPython 以保存输出历史记录。
其他几个魔法函数可以使用您的输入历史记录,包括 %edit、%rerun、%recall、%macro、%save 和 %pastebin。您可以使用标准格式来引用行:
%pastebin 3 18-20 ~1/1-5
这将从当前会话中获取第 3 行和第 18 至 20 行,并从上一个会话中获取第 1 至 5 行。
请参阅 %history? 了解文档字符串和更多示例。
此外,请务必探索%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}
要在启动时自动恢复存储的变量,请c.StoreMagic.autorestore = True
在 ipython_config.py 中指定。
解决方案 10:
这个%history
命令很棒,但不幸的是它不允许您保存 %paste 到 sesh 中的内容。要做到这一点,我认为您必须%logstart
在开始时就这样做(尽管我还没有确认这是否有效)。
我喜欢做的是
%history -o -n -p -f filename.txt
它将保存输出、行号以及每个输入(o、n 和 p 选项)前的“>>>”。请参阅此处的%history 文档。
解决方案 11:
再提一个建议:
Spyder
它有历史记录和变量探索器。如果你用过 MatLab,你就会发现它们有相似之处。
解决方案 12:
就 Linux 而言,可以使用script
命令来记录整个会话。它是util-linux
软件包的一部分,因此应该在大多数 Linux 系统上都有。您可以创建将调用的别名或函数script -c python
,并将其保存到typescript
文件中。例如,下面是此类文件的重印。
$ cat typescript
Script started on Sat 14 May 2016 08:30:08 AM MDT
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello Pythonic World'
Hello Pythonic World
>>>
Script done on Sat 14 May 2016 08:30:42 AM MDT
这里的小缺点是,它script
会记录所有内容,甚至换行符、按退格键等。因此,您可能需要使用它col
来清理输出(请参阅Unix&Linux Stackexchange 上的这篇文章)。
解决方案 13:
还有另一个选择---pyslice。在“wxpython 2.8 docs demos and tools”中,有一个名为“pyslices”的开源程序。
您可以像编辑器一样使用它,它也支持像控制台一样使用 ---- 像交互式解释器一样执行每一行并立即回显。
当然,所有的代码块和每个块的结果都会自动记录到一个txt文件中。
结果就记录在相应的代码块后面。非常方便。
解决方案 14:
有些评论询问如何一次性保存所有 IPython 输入。对于 IPython 中的 %save magic,您可以像下面这样以编程方式保存所有命令,以避免出现提示消息,也避免指定输入数字。currentLine = len(In)-1 %save -f my_session 1-$currentLine
该-f
选项用于强制文件替换并len(IN)-1
显示 IPython 中的当前输入提示,允许您以编程方式保存整个会话。
解决方案 15:
在IPython中,我首先使用
In [2]: %hist
查看我过去的代码。我选择要保存的块,然后my_file.py
使用%%file
magic(简称%%writefile
)将其粘贴到文件中
In [3]: %%file my_file.py
...: # paste code here
...:
...:
最终两次回击。
要附加到文件,请使用选项-a
:%%file -a my_file.py
。
如果需要,我可以使用感叹号在底层命令行中列出、编辑等文件
In [5]: !ls -l my_file.py
In [6]: !vi my_file.py
解决方案 16:
对于使用spacemacs
以及ipython
附带的用户来说python-layer
,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 s
解决方案 17:
如果您使用bpython,则所有命令历史记录默认保存到~/.pythonhist
。
为了保存命令以供以后重复使用,您可以将它们复制到 Python 脚本文件中:
$ cp ~/.pythonhist mycommands.py
然后编辑该文件以清理它并将其放在 Python 路径下(全局或虚拟环境的站点包、当前目录、在 *.pth 中提及或其他方式)。
要将命令包含到你的 shell 中,只需从保存的文件中导入它们:
>>> from mycommands import *
解决方案 18:
我想建议另一种通过 Linux 上的 tmux 维护 python 会话的方法。运行 tmux,将自己附加到您打开的会话(如果直接打开后没有附加)。执行 python 并在其上执行任何操作。然后脱离会话。脱离 tmux 会话不会关闭会话。会话保持打开状态。
此方法的优点:
您可以从任何其他设备连接到此会话(如果您可以通过 ssh 连接您的 PC)
此方法的缺点:
直到您实际退出 Python 解释器时,此方法才会放弃打开的 Python 会话所使用的资源。
解决方案 19:
要在 XUbuntu 上保存输入和输出:
在 XWindows 中,从 Xfce 终端应用程序运行 iPython
点击顶部菜单栏,在下拉菜单中
Terminal
查找save contents
我发现这可以保存输入和输出,一直追溯到我打开终端时。这不是 ipython 特有的,可以与 ssh 会话或从终端窗口运行的其他任务一起使用。
解决方案 20:
您可以使用内置函数打开:我在所有需要存储一些历史记录的程序中使用它(包括计算器等)例如:
#gk-test.py or anything else would do
try: # use the try loop only if you haven't created the history file outside program
username = open("history.txt").readline().strip("
")
user_age = open("history.txt").readlines()[1].strip("
")
except FileNotFoundError:
username = input("Enter Username: ")
user_age = input("Enter User's Age: ")
open("history.txt", "w").write(f"{username}
{user_age}")
#Rest of the code is secret! try it your own!
我要感谢所有喜欢我评论的人!谢谢你们阅读这篇文章!
扫码咨询,免费领取项目管理大礼包!