Ipython: 第一次导入后的奇怪字符

创建于 2018-09-27  ·  33评论  ·  资料来源: ipython/ipython

我正在运行 python 7.0.1 一切似乎都很好,但在第一次导入后,我一直得到一个奇怪的符号(见附件截图)。 当我再次按 Enter 时,符号消失并且不再出现。 我在 mac 上的 iterm2 终端上使用鱼壳。

screenshot 2018-09-27 at 13 51 00

[更新]

将 prompt_toolkit 升级到 2.0.6 应该可以解决这个问题。

help wanted

所有33条评论

嗯,我见过这个,但是^[[43;1R ,但我认为这是因为我是我的终端模拟器的主人。 不知道这是从哪里来的

我在最新的https://github.com/jonathanslenders/pymux (未发布,使用 prompt-toolkit 2)中看到了类似的东西。 也许@jonathanslenders有一些想法?

我得到相同的:

$ ipython
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import os                                                                                             

^[[19;1RIn [2]:

如果我然后尝试选项卡完成:

In [2]: os.p                                                                                                  
os.pardir         os.pathconf       os.pathsep        os.popen          os.putenv         
os.path           os.pathconf_names os.pipe           os.pread          os.pwrite         
^[[19;1RIn [2]: os.p

这使得选项卡完成几乎无法使用。

是否有可能通过以下提交修复: https :
它已合并到 prompt_toolkit master 中,但我即将发布包含它的新 prompt_toolkit 2.0。

我从 master 安装了prompt-toolkit并且问题似乎仍然存在,但我不确定在 ipython 方面是否需要做其他事情。

不,我很确定这不是 IPython。 我会尝试用 iterm2 重现

我确定我不理解这里的复杂性,但仅供参考,这确实发生在 IPython 7.0 和 7.1 中,并且不会发生在 6.0 或 6.5 中,在同一个 virtualenv 中进行测试。

你们都可以发布你在哪个终端看到的吗?
我可以在 iTerm2 – 3.2.1beta6 – osx 上重现; alacritty v0.2.0-35-ga53cabf osx,但不是在裸 Macos terminal.app (sierra 10.12.6) 上

终端的广告功能与它们实际可以做什么之间是否不匹配?

它也不能用ipython --colors=nocolor重现(对我来说)

在 High Sierra 10.13.6 上只是裸 Terminal.app。 nocolor不适合我。

它也不能用ipython --colors=nocolor重现(对我来说)

从头开始,它似乎是随机的,但确实,nocolor 没有修复它。

你们可以尝试删除这个patch_stdout上下文管理器吗?

如果我删除它,它_似乎_对我来说很好,如果我额外刷新标准输出,我会遇到两次问题..

删除上下文管理器似乎为我解决了这个问题。

我在 macOS Terminal.app 和 iTerm2 中都会发生这种情况。 然而,这个角色在 iTerm2 3.2.1beta 中出现得相当一致。 今天早上我升级到 3.2.2beta1,现在这个字符似乎出现并立即消失,取而代之的是正常的 iPython 提示。 但至少在一种情况下,角色一直很执着,我不确定有什么不同。

是的,也帮我修好了。 效果对我来说总是一致的。

@jonathanslenders可能是补丁标准输出有竞争条件,标准输出/错误被恢复,并在刷新发生之前开始写入?

patch_stdout 的raw参数在 ptk 代码中似乎也无处可去。

所以有理由这样做,否则在后台线程中打印会弄乱渲染,但它看起来(对我来说),这是刷新捕获的 stderr/out 和恢复到它们的初始值之间的竞争条件。

不确定您是否对错误进行了本地化或仍在试验中,但仅供参考:

  • macOS 10.13.6
  • iTerm 3.2.1 - 在第一次输入后总是显示^[[41;1R (导入,表达式,甚至空行)
  • Terminal.app 2.8.2 (404) - 工作正常!
Python 3.7.0 (default, Sep 18 2018, 18:47:22)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

^[[41;1RIn [1]:

我也非常频繁地得到这个(macOS 10.11.6,iTerm 3.2.0beta5),尽管不是 100% 的时间,并且使用43;1R序列。

Python 3.7.0 (default, Jun 29 2018, 20:13:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import sqlalchemy

^[[43;1RIn [2]:

是的,这个真的杀了我。 我会降级,但这会破坏 Jupyter 笔记本。 对我来说,制表符补全或多或少完全被破坏了,因为这些字符出现得非常频繁。

遗憾的是 readline 目前不是一个选项: https :

运行prompt_toolkit当前主节点(版本 2.0.5)没有变化。

我可以重现它。

iTerm2 build 3.2.3(我认为是最新的)、IPython 7.0.1、Python 3.6.1。

我在 Ubuntu 上有 Python 3.6.3 的错误,它在 Python 3.7 中消失了,尽管我可以看到一些小故障(比如字符被打印出来然后被快速删除)。

我在这里有一个修复: https :

实际上,您在此提交中看到的是两个单独的修复程序,它们都可以解决问题(对于我可以重现的内容)。

  • 出于某种原因,就在接受第一个输入之前,捕获了一个空字符串并将其写入标准输出。 这触发了 patch_stdout 代码。 其实,没有必要把提示删掉,再画一遍,打印一个空字符串就行了。 (我仍然需要检查为什么会发生这种情况。)

  • 真正的解决方法是在呈现捕获的内容之前等待 CPR 响应。 CPR 异步工作。 我们通过向 stdout 写入一些内容来请求光标位置,然后我们在 stdin 上接收来自终端的响应。 总是有一点延迟。 但重要的是将终端保持在 RAW 模式并读取此输入,直到此响应到达。 我们没有这样做,它使用光标位置呈现终端自己的响应。

终端之间的时间应该略有不同,但我想这应该可以。

你们都可以尝试使用最新的 prompt_toolkit 提交吗? 如果有效,我会推送一个新版本。

这修复了我这边的错误。 谢谢@jonathanslenders

是的,非常感谢,最新的大师也为我修复了它。

该补丁修复了我也遇到的一些[[39;1R字符。 谢谢!

编辑:从头开始。 我正在测试错误的版本。 是的,这似乎也为我解决了这个问题。


不,这似乎不能解决我的问题。 相反,我得到了一个不同的角色

AlbireoProˇalbireo: Downloads » ipython                 (3.7.0 2.7.15)

In [1]: from can.interfaces.slcan import slcanBus

^[[21;1RIn [2]:

你们都可以尝试使用最新的 prompt_toolkit 提交吗? 如果有效,我会推送一个新版本。

为我工作。 您还更改了颜色的处理 AFAICT,我们不情愿地在 IPython 的某些地方依赖 ansi 映射到 ansi 代码,我也会解决这个问题。 谢谢 !

@Carreau :我刚刚推送了 prompt_toolkit 2.0.6。
IPython 是否希望某些 RRGGBB 序列映射到某些 ANSI 颜色,即使在 256color 模式下?

顺便说一句@Carreau ,现在

预计

我不会说“期望”,但主题似乎混合了#ansixxx#00ff00 ,它们看起来很好,并且与 2.0.6 的差异更大一些。

screen shot 2018-10-12 at 10 03 56

我认为我们只需要更多的一致性来决定我们是使用#ansi还是#hex

我会在某个时候查看亮度选项。 几周前我刚刚开始了一个新的职位,开发 IPython/jupyter 本身的时间更少了。

有趣,但它是有道理的。 当颜色定义为 #00ff00 时,我会查看 256 色调色板中最接近的颜色,但我排除了 16 种 ansi 颜色。 这意味着它从剩余的 240 种颜色中取最接近的。

原因是现在人们经常为 ANSI 颜色定义自定义配色方案 - 而不是为剩余的 240 种颜色定义。 因此,虽然在您的情况下它可能有点偏差,但实际上它可能更接近其他人的真实颜色。

以下是如何在不同终端中呈现基本 ANSI 颜色的示例:
https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

上游固定关闭

此页面是否有帮助?
0 / 5 - 0 等级