Winpty和Git Bash

65

我遇到了和Python在Git Bash中无法正常工作的问题相同的问题,当我在Git Bash中输入Python时,它会卡住。

然而,输入winpty python则可以正常工作。

winpty是什么?为什么上述命令很有用?


1
https://github.com/git-for-windows/git-sdk-64/pull/35 - NeilG
1个回答

54
引用自述文件

winpty是一个Windows软件包,提供类似于Unix pty-master的接口,用于与Windows控制台程序进行通信。

Winpty是一个兼容层,允许您从Linux终端运行Windows控制台应用程序。

  • 当您从Linux交叉编译一个程序到Windows时,生成的二进制文件将是一个可以直接从Linux终端运行的Windows控制台应用程序,无需使用winpty
  • 然而,如果您在Windows上本地构建一个程序,生成的二进制文件将是一个无法从Linux终端运行的Windows GUI应用程序。
    为了从Linux终端运行Windows GUI应用程序,您需要使用winpty

这就是为什么您需要它,如此处所述

该软件通过启动winpty-agent.exe进程,并在一个新的隐藏控制台窗口中运行,该窗口在控制台API和终端输入/输出转义码之间建立桥梁。它轮询隐藏控制台的屏幕缓冲区以检测变化,并生成相应的输出流。 rprichard/winpty中提到:
该软件包包括一个库(libwinpty)和一个用于在Cygwin和MSYS中运行Windows控制台程序的工具,用于在Cygwin/MSYS pty中运行。
正如在“mintty/mintty Tips”中详细说明的那样:
当与使用本机Windows API进行命令行用户交互(“控制台模式”)的程序进行交互时,会出现一些不良影响;这就是pty不兼容问题字符编码不兼容问题
这基本上会影响所有未在cygwin或msys环境中编译的程序(请注意,在此上下文中,MinGW不是msys)。

作为解决方法,您可以使用winpty作为调用Windows程序的包装器。


所以:
为什么许多工具在普通的CygWin中可以工作,但有些工具还需要winpty呢?
这个问题(特别是针对Python)在msys2/MINGW-packages issue 2645中提出。
使用winpty会带来一定的性能损耗,而大多数情况下,mintty都能正常工作。 你的问题源于尝试使用mingw python,它是一个本地的Windows版本,因此期望从Windows控制台中使用。 mintty使用管道进行输入/输出,所以对大多数程序来说,它看起来不像一个真正的终端。
另一方面,如果你使用msys2(或cygwin)的python(例如/usr/local/bin/python2),一切都能正常工作。
(使用msys2/MINGW-packages PR 2675,python3能正确地检测到终端)
另请参阅 "在Git Bash命令行中Python无法工作",作者为Gabriel Staples

好的...但这不是CygWin的描述吗?为什么许多工具在普通的CygWin中可以工作,但有些工具还需要winpty呢? - East of Nowhere
@EastofNowhere 我怀疑是因为它是 Python 的本机 Windows 构建版本。请参见我的编辑答案。 - VonC
那么,如果我这样陈述是否准确呢?:如果程序是从Linux交叉编译为Windows的,它不需要通过winpty来调用,但如果它是在Windows上本地构建的,则需要通过winpty来调用。 - Gabriel Staples
1
@GabrielStaples 是的,那个陈述是准确的。Winpty 是一个兼容层,它允许您从 Linux 终端运行 Windows 控制台应用程序。当您从 Linux 交叉编译一个程序到 Windows,生成的二进制文件将是一个可以直接从 Linux 终端运行的 Windows 控制台应用程序,无需使用 winpty。然而,如果您在 Windows 上本地构建一个程序,生成的二进制文件将是一个无法从 Linux 终端运行的 Windows 图形界面应用程序。为了从 Linux 终端运行 Windows 图形界面应用程序,您需要使用 winpty。 - VonC
@VonC,谢谢你。我觉得这个回答比你的回答更好。考虑将这个作为你回答的开头。 - Gabriel Staples
1
@GabrielStaples 感谢您的反馈。我已相应地编辑了答案。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接