如何保存 Python 交互会话?

2025-02-18 09:23:00
admin
原创
99
摘要:问题描述:我发现自己经常使用 Python 的解释器来处理数据库、文件等——基本上是大量手动格式化半结构化数据。我没有像我希望的那样经常正确地保存和清理有用的部分。有没有办法将我的输入保存到 shell 中(数据库连接、变量赋值、小 for 循环和逻辑部分)——一些交互式会话的历史记录?如果我使用类似的东西,...

问题描述:

我发现自己经常使用 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文件中。

结果就记录在相应的代码块后面。非常方便。

pyslices 概述

解决方案 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使用%%filemagic(简称%%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 上保存输入和输出

  1. 在 XWindows 中,从 Xfce 终端应用程序运行 iPython

  2. 点击顶部菜单栏,在下拉菜单中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!

我要感谢所有喜欢我评论的人!谢谢你们阅读这篇文章!

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2679  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1614  
  在产品生命周期管理(PLM)系统的应用中,需求优先级排序是至关重要的环节。它直接关系到资源的合理分配、项目的推进效率以及最终产品能否精准满足市场需求。决策矩阵作为一种有效的工具,能够在PLM系统中为需求优先级排序提供有力支持,帮助企业做出更明智、更科学的决策。PLM系统与需求优先级排序的重要性PLM系统涵盖了产品从概念...
plm项目管理   0  
  产品生命周期管理(PLM)作为企业管理产品全生命周期的关键手段,在数字化时代正经历着深刻变革。随着技术的飞速发展和市场需求的不断变化,2025 年 PLM 行业将呈现出一系列引人注目的数字化转型方向。这些趋势不仅将重塑企业管理产品的方式,还将为企业在激烈的市场竞争中赢得优势。深入了解这些趋势,对于企业制定战略、优化流程...
plm软件   0  
  PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它涵盖了从产品概念设计到退役的全生命周期,整合了人员、流程和数据,助力企业提升效率、降低成本并增强创新能力。然而,企业在引入PLM系统时,需要进行全面且深入的评估,以确保所选系统能够满足自身业务需求,并带来可观的投资回报率(ROI...
plm系统的作用   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用