【问题标题】:How to save a Python interactive session?如何保存 Python 交互式会话?
【发布时间】:2010-10-31 04:10:39
【问题描述】:

我发现自己经常使用 Python 的解释器来处理数据库、文件等——基本上是对半结构化数据进行大量手动格式化。我没有像我想的那样经常正确地保存和清理有用的位。有没有办法将我的输入保存到 shell 中(db 连接、变量分配、少量 for 循环和一些逻辑)——交互式会话的一些历史记录?如果我使用script 之类的东西,我会收到太多的标准输出噪音。我真的不需要腌制所有的对象——尽管如果有一个解决方案可以做到这一点,那就没问题了。理想情况下,我只剩下一个脚本,该脚本作为我以交互方式创建的脚本运行,我可以删除我不需要的位。有没有这样的包,或者DIY方法?

【问题讨论】:

    标签: python shell read-eval-print-loop interactive-session


    【解决方案1】:

    来自 Andrew Jones 的网站 (archived):

    import readline
    readline.write_history_file('/home/ahj/history')
    

    【讨论】:

    • 在 Windows 7 上为我创建一个空文件
    • 在 Ubuntu 中工作对我来说就像一个魅力。
    • @ubershmekel - 看起来像 only works on Unix
    • 在我的 TI-83 上失败
    • 记得在会话结束时进行。仅在开始时调用该函数后,我的看起来有点空。
    【解决方案2】:

    您可以使用内置函数 open:我在所有我的 我需要在其中存储一些历史记录的程序(包括计算器等) 例如:

    #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("\n")
        user_age = open("history.txt").readlines()[1].strip("\n")
    except FileNotFoundError:
        username = input("Enter Username: ")
        user_age = input("Enter User's Age: ")
        open("history.txt", "w").write(f"{username}\n{user_age}")
    #Rest of the code is secret! try it your own!
    

    我要感谢所有喜欢我的 cmets 的人!感谢您阅读本文!

    【讨论】:

      【解决方案3】:

      IPython,我第一次使用

      In [2]: %hist
      

      查看我过去的代码。我选择要保存的块,然后使用 %%file 魔术(%%writefile 的缩写)将其粘贴到文件 my_file.py

      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
      

      【讨论】:

        【解决方案4】:

        在 XUbuntu 上保存输入和输出

        1. 在 XWindows 中,从 Xfce 终端应用程序运行 iPython
        2. 点击顶部菜单栏中的Terminal,然后在下拉菜单中查找save contents

        我发现这可以保存输入和输出,一直到我打开终端时。这不是 ipython 特定的,可以与 ssh 会话或从终端窗口运行的其他任务一起使用。

        【讨论】:

          【解决方案5】:

          IPython 如果您喜欢使用交互式会话,则非常有用。例如,对于您的用例,有 the %save magic command,您只需输入 %save my_useful_session 10-20 23 即可将输入的第 10 行到第 20 行和第 23 行保存到 my_useful_session.py(为了帮助解决这个问题,每一行都以其编号为前缀)。

          此外,文档指出:

          此函数对输入范围使用与 %history 相同的语法,然后将行保存为您指定的文件名。

          这允许例如引用较旧的会话,例如

          %save current_session ~0/
          %save previous_session ~1/
          

          查看the videos on the presentation page 以快速了解这些功能。

          【讨论】:

          • 如何保存所有的行?如果不指定范围,它会创建一个空文件。 :(
          • @balki,IPython 的提示会告诉您历史记录中有多少行(即In[48])。所以save filename 1-48 会保存你的整个会话。
          • 另外,是否可以将此文件加载回 ipython 并保持输入历史记录完整?
          • @BenPage 在保存的 .py 文件上使用“ipython -i [filename]”,从 bash 提示符中,以便在返回交互式控制台之前重新加载文件! (没有 -i 标志,您在运行文件后不会获得交互式控制台)。
          • @user4779,正如人们所期望的那样:%load my_useful_session
          【解决方案6】:

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

          这种方法的优点: 你可以从任何其他设备附加到这个会话(如果你可以 ssh 你的电脑)

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

          【讨论】:

            【解决方案7】:

            如果您使用 bpython,您的所有命令历史记录默认保存到 ~/.pythonhist

            要保存命令以供以后重复使用,您可以将它们复制到 python 脚本文件:

            $ cp ~/.pythonhist mycommands.py
            

            然后编辑该文件以清理它和put it under Python path(全局或虚拟环境的站点包、当前目录、在 *.pth 中提及或其他方式)。

            要将命令包含到您的 shell 中,只需从保存的文件中导入它们:

            >>> from mycommands import *
            

            【讨论】:

            • 救命稻草。很难找到答案
            【解决方案8】:

            %history 命令很棒,但不幸的是,它不会让您将 %paste 的内容保存到 sesh 中。要做到这一点,我认为你必须这样做 %logstart at the beginning (虽然我还没有确认这个工作)。

            我喜欢做的是

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

            这将在每个输入之前保存输出、行号和“>>>”(o、n 和 p 选项)。请参阅 %history here 的文档。

            【讨论】:

              【解决方案9】:

              对于那些使用 spacemacspython-layer 附带的 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 s

              【讨论】:

                【解决方案10】:

                一些 cmets 询问如何一次保存所有 IPython 输入。对于 IPython 中的 %save 魔法,您可以如下所示以编程方式保存所有命令,以避免出现提示消息并避免指定输入数字。 currentLine = len(In)-1 %save -f my_session 1-$currentLine

                -f 选项用于强制文件替换,len(IN)-1 显示 IPython 中的当前输入提示,允许您以编程方式保存整个会话。

                【讨论】:

                  【解决方案11】:

                  就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 来清理输出(请参阅 this post on Unix&Linux Stackexchange)。

                  【讨论】:

                    【解决方案12】:

                    只是把另一个建议放在碗里: Spyder

                    它有历史记录变量浏览器。如果您使用过 MatLab,那么您会看到相似之处。

                    【讨论】:

                      【解决方案13】:

                      有 %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 行。

                      查看%历史记录?对于 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 中指定c.StoreMagic.autorestore = True

                      【讨论】:

                      • 启用保存输出历史可以通过在配置文件中启用c.HistoryManager.db_log_output来完成。
                      【解决方案14】:

                      如果您使用IPython,您可以使用魔术函数%history-f 参数pe 将所有之前的命令保存到文件中:

                      %history -f /tmp/history.py
                      

                      【讨论】:

                      • 不确定使用 save 魔法的文件位置。这很有帮助
                      • 使用%history -g -f full_history.py 获取所有会话的历史记录,而不仅仅是当前会话。另见:documentation for %history.
                      【解决方案15】:

                      有一个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
                      

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

                      export PYTHONSTARTUP=$HOME/.pystartup
                      

                      您还可以添加它以免费获得自动完成功能:

                      readline.parse_and_bind('tab: complete')
                      

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

                      【讨论】:

                      • Mac OS X 使用编辑行,因此有可用的制表符完成功能,但确切的命令不同:readline.parse_and_bind("bind ^I rl_complete")
                      • 那太快了,Nadia,非常感谢。我会尝试这两个答案——目标平台是 Ubuntu,顺便说一句
                      • 如果您使用 MacPorts Python,readline.parse_and_bind('tab: complete') 可以工作。
                      • 这应该被框起来。在 RHEL 6.6 上工作。 Pyenv,2.7.10。
                      • 为什么这些年我没有搜索这个!该解决方案非常棒,因为它使用了快速轻便的原始工具。
                      【解决方案16】:

                      安装Ipython,并通过运行命令打开Ipython会话后:

                      ipython
                      

                      从您的命令行,只需运行以下 Ipython 'magic' 命令即可自动记录您的整个 Ipython 会话:

                      %logstart
                      

                      这将创建一个唯一命名的 .py 文件并存储您的会话,以供以后用作交互式 Ipython 会话或在您选择的脚本中使用。

                      【讨论】:

                        【解决方案17】:

                        我不得不努力寻找答案,我对 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 文件中。

                        【讨论】:

                          【解决方案18】:

                          除了 IPython,一个类似的实用程序 bpython 具有“将您输入的代码保存到文件”功能

                          【讨论】:

                          • 谁能解释一下这是如何用 bpython 完成的?我尝试了 ctrl+s 但它不起作用(运行 Gnome 终端的 Python 3.4.3 之上的版本 0.14.2)
                          • 默认绑定F7。 F1 将向您显示帮助和当前的键绑定。
                          • F7 启动外部编辑器。 Ctrl+s 应该提示一个简单的保存到文件功能,但它在 bash 和 zsh 中必然会“停止”,因此您需要在 bpython 配置中选择一个替代方案。
                          【解决方案19】:

                          还有另一种选择 --- pyslice。 在“wxpython 2.8 docs demos and tools”中,有一个名为“pyslices”的开源程序。

                          您可以像编辑器一样使用它,它还支持像控制台一样使用----像交互式解释器一样执行每一行并立即回显。

                          当然,所有的代码块和每个块的结果都会自动记录到一个txt文件中。

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

                          【讨论】:

                          • PySlices 作者在这里。很高兴你喜欢 PySlices(你甚至找到了它)。它还不是完全废弃的软件(我实际上仍在使用它),但是 wxPython 本身包含的版本通常不能很好地工作。如果您想关注更新,您可以从 wx_py 包中获取它们:pypi.python.org/pypi/wx_pygithub.com/davidmashburn/wx_py
                          【解决方案20】:

                          另外,reinteract 为您提供了一个类似于笔记本的 Python 会话界面。

                          【讨论】:

                          • reinteract 现在被 IPython Notebook 和 QtConsole 取代。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2010-10-29
                          • 2019-02-15
                          • 1970-01-01
                          • 2017-06-17
                          • 2022-07-06
                          • 2012-10-18
                          • 1970-01-01
                          相关资源
                          最近更新 更多