【问题标题】:SublimeREPL: How can I automatically close (or restart) the previous console when rebuilding?SublimeREPL:重建时如何自动关闭(或重新启动)以前的控制台?
【发布时间】:2018-05-24 05:52:16
【问题描述】:

我最近切换到使用 Sublime Text 作为我的 Python IDE,并且已经安装了 REPL。为了在运行我的代码时重复使用相同的选项卡,我在我的SublimeREPL\config\Python\Main.sublime-menu 目录中进行了一些编辑repl_python_run 命令。 (此处的说明:Re-use tab ... SublimeREPL

这很好用,当我重新构建脚本 (cmd + B) 时,新的输出保持在同一个选项卡中;但是,我想在这样做之后自动关闭/重新启动以前的控制台。原因是我不断积累必须手动关闭的开放python环境。

Here is a picture of my taskbar after running the same code three times

Here is a picture of the tab where REPL is running.

如第二张图所示,我可以在重建前输入exit(),但如果能自动完成就更好了。我的想法是,我可以以某种方式将以前的控制台设置为在重建后关闭,或者我可以通过一个简单的命令在同一个控制台中“重新运行”代码。

【问题讨论】:

    标签: python sublimetext3 sublimerepl


    【解决方案1】:

    我做了一个肮脏的解决方法,它以某种方式起作用。我编辑了sublimerepl.py 喜欢:

    if view.name() == view_id:
        found = view
        old_rv = self.repl_view(found)
        if old_rv:
            old_rv.on_close()
        window.focus_view(found)
        break
    

    我还更改了 on_close 函数

     self.repl.close()
    

     self.repl.kill()
    

    现在,Python 实例的数量保持不变。

    仍有一些不一致之处。当我使用此代码与 Arduino 对话时,我会每隔一段时间收到一个PermissionError。添加time.sleep(1) 并没有改变这一点。我愿意接受建议。


    编辑:使用我的“解决方案”一段时间后,每次执行代码时都会出现***Repl Killed***,这让我很恼火。因此,我决定关闭当前的 REPL 视图并开始一个新的视图。这样,我就不会得到不必要的选项卡,后台 Python shell 会关闭,并且每次执行代码时都会开始一个全新的视图。 sublimerepl.py 的新代码是:

    for view in window.views():
        if view.name() == view_id:
            view.close()
            break
    view = window.new_file()
    

    由于某种原因,close() 仍然必须替换为 kill()

    【讨论】:

      【解决方案2】:

      受@Not_a_programmer 帖子的启发,我做了一些稍微不同的修改。

      在 sublimerepl.py (Windows 10) 文件 C:\Users\User\AppData\Roaming\Sublime Text 3\Packages\SublimeREPL

      搜索并更改下面的代码:

      if view.name() == view_id:
          found = view
          old_rv = self.repl_view(found)
              if old_rv:
                  old_rv.on_close()
          #window.focus_view(found)    
          break
      

      我评论了这个通常默认的功能,它将 sublimes 视图集中在新打开的 repl 上。接下来由于某种原因有必要像这样更改“on_close”功能:

      def on_close(self):
          self.repl.kill()
          for fun in self.call_on_close:
              fun(self)
      

      这在大多数情况下都可以解决问题,但我在 repl 输出中遇到了问题,其中运行新 repl 时“REPL KILLED”文本有时会破坏输出,所以在同一个文件中,我注释掉了这一行:

      # self.write("\n***Repl Killed***\n""" if self.repl._killed else "\n***Repl Closed***\n""")
      

      这在运行新进程之前有效地结束了 repl 进程,并且至少可以方便地防止 Python 超出我的任务管理器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-29
        • 2018-09-20
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多