【问题标题】:How do I get IPython 5 to work with SublimeREPL?如何让 IPython 5 与 SublimeREPL 一起使用?
【发布时间】:2016-08-20 20:09:47
【问题描述】:

我遵循(实际上是我编写的)this gist 中的说明来修改 SublimeREPL 附带的 ipy_repl.py 文件,以便使其与当时更新版本的 IPython 一起使用。不过,我最近pip 升级了我的 IPython 和 Jupyter 包

pip3 install -U ipython jupyter

到最新版本,现在尝试从 Sublime 启动 IPython 会话时出现此错误:

Traceback (most recent call last):
  File "/home/mattdmo/.config/sublime-text-3/Packages/SublimeREPL/config/Python/ipy_repl.py", line 66, in <module>
    embedded_shell.initialize()
  File "<decorator-gen-113>", line 2, in initialize
  File "/usr/local/lib/python3.5/dist-packages/traitlets/config/application.py", line 74, in catch_config_error
    return method(app, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/jupyter_console/app.py", line 137, in initialize
    self.init_shell()
  File "/usr/local/lib/python3.5/dist-packages/jupyter_console/app.py", line 110, in init_shell
    client=self.kernel_client,
  File "/usr/local/lib/python3.5/dist-packages/traitlets/config/configurable.py", line 412, in instance
    inst = cls(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/jupyter_console/ptshell.py", line 252, in __init__
    self.init_prompt_toolkit_cli()
  File "/usr/local/lib/python3.5/dist-packages/jupyter_console/ptshell.py", line 404, in init_prompt_toolkit_cli
    self.pt_cli = CommandLineInterface(app, eventloop=self._eventloop)
  File "/usr/local/lib/python3.5/dist-packages/prompt_toolkit/interface.py", line 80, in __init__
    self.output = output or create_output()
  File "/usr/local/lib/python3.5/dist-packages/prompt_toolkit/shortcuts.py", line 124, in create_output
    ansi_colors_only=ansi_colors_only, term=term)
  File "/usr/local/lib/python3.5/dist-packages/prompt_toolkit/terminal/vt100_output.py", line 425, in from_pty
    assert stdout.isatty()
AssertionError

我做了一点挖掘,在 2016 年 2 月上旬之后的某个时间点,prompt_toolkit 模块在 jupyter_console 中开始使用。虽然我认为这会给整个项目带来一些好处,但一个缺点是所有与jupyter_console 通信的文本接口都必须是 TTY(一个相当愚蠢的要求,IMO),而 Sublime 视图不是。

我无法找到解决此错误 功能的方法。有谁知道如何解决这个问题?

【问题讨论】:

    标签: python ipython sublimetext jupyter sublimerepl


    【解决方案1】:

    通过一系列偶然的事件,我遇到了一个我好几个月没用过的旧 Win7 VM,也没有升级,所以 IPython REPL 仍然可以工作。通过一些小实验,我发现如果我将ipython 降级到4.1.1 版本,将jupyter_console 降级到4.1.0,一切正常:

    pip3 install -U ipython==4.1.1 jupyter_console==4.1.0
    

    这不是一个完美的解决方案,因为我无法使用 IPython 5 的新功能,但它绝对比一直盯着回溯更可取。我已经更新了问题中提到的my gist 以反映这一发现,并想在此处发布此问答以宣传,但我仍在寻找使 IPython 5 正常工作的方法。

    【讨论】:

    • 我不熟悉 SublimeREPL,但我们为 Emacs 的“劣质外壳”功能的用户在 IPython 中添加了 --simple-prompt 标志。也许 SublimeREPL 也可以这样工作?这会完全禁用 prompt_toolkit 和 readline。
    • @ThomasK 你知道如何以编程方式访问它吗?我不知道您是否看过ipy_repl.py 的要点,但基本上它所做的是建立与ZMQTerminalIPythonApp 实例的连接,然后使用它与内核进行通信。您可以通过cfg.InteractiveShell.simple_prompt = True 之类的机制访问--simple-prompt 选项吗?
    • @ThomasK 我查看了 IPython 文档,并使用了cfg.TerminalInteractiveShell.simple_prompt = True,但仍然得到与我的问题完全相同的错误。我们已经设置了os.environ['TERM'] = 'emacs' 来获得“inferior-shell”行为,所以我不确定还能做什么。
    • 您显示的回溯来自jupyter_console,而不是 IPython。你有理由需要使用它吗?我们应该向 jupyter_console 添加一个类似的选项,但我们还没有。
    • @ThomasK jupyter_console.app 包含ZMQIPythonTerminalApp,这是整个连接系统的基础。从 IPython 4 开始,它已从 IPython.terminal.console.app 中移出。
    【解决方案2】:

    我已修改您的要点,使其适用于最新版本的 Jupyter/IPython 6.1.0。

    您只需要插入额外的配置
    cfg.ZMQTerminalInteractiveShell.simple_prompt = True
    在第 38 行和第 41 行之间。

    第 68 - 73 行的 hack
    if os.name == "nt":
    在 Win 7/10 上对我来说不是必需的。如果您不将其注释掉,它只会显示两次横幅。

    强制使用 simple-prompt 选项仅提供有限的 shell 功能(例如,没有多行条目)。
    可以选择使用IPython.terminal.ipapp.TerminalIPythonApp 而不是jupyter_console.app.ZMQTerminalIPythonApp 来使用IPython shell。然而,在那里,您失去了 GUI 事件循环集成(即 %gui 魔法)。

    另外,在 Sublime Text 中关闭 shell 窗口时,我无法弄清楚如何正确退出 Jupyter shell。不先发出quit命令,jupyter内核的连接文件并没有被删除——谁知道还有什么一直在运行……

    【讨论】:

      【解决方案3】:

      我也遇到同样的问题,我解决了,我也回答了这个问题here

      有两种制作方法,win10、conda python3.6.7、Ipython7.1.1、Sublime 3.1.1

      1.打开\Packages\SublimeREPL\config\Python\Main.sublime-menu,找到该行

      "windows": ["python", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"]
      

      并将其更改为 ipython.exe 所在的位置,对我来说是

      "windows": ["C:\Python\envs\py37\Scripts\ipython.exe"]
      

      2.刚刚修改\Packages\SublimeREPL\config\Python\ipy_repl.py为3行,

      import os
      # change dir to path_to_ipython.exe
      os.chdir(r'C:\Python\envs\py37\Scripts')
      os.system('ipython')
      

      我更喜欢第二种方法,如果您遇到第一种方法的问题,例如您关于 sublimeREPL 的快捷方式不起作用(发生在我身上:(),请尝试第二种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-05
        • 2016-02-22
        • 2015-04-24
        • 1970-01-01
        • 2017-05-20
        • 2021-05-03
        • 2018-10-28
        • 2015-07-18
        相关资源
        最近更新 更多