40

安装新的 Windows 系统后,我在默认位置 (c:\cygwin和 ) 安装了 CygWin 和 64 位 Python (2.7.3) c:\Python27\python,并将 CygWin bin 和 Python 目录添加到我的路径中(在用户变量 PATH 中)。从正常的命令窗口,Python 完美启动,但是当我bash在 CygWin 环境中调用它时,它挂起,从不给我输入提示。

我以前在其他机器上做过这个,但总是使用旧版本的 Python(32 位)和 CygWin,并且 Python 位于一个绝对非标准的位置。有没有其他人遇到过这个问题,或者有人可以告诉我可能是什么原因造成的吗?

4

8 回答 8

56

试试这个

python -i

是的,您会在这里和那里发现一些故障!

选项-i强制交互式提示,如此处的 Python 帮助python -h页面所示。

$ python -h
-i  : inspect interactively after running script; 
      forces a prompt even if stdin does not appear to be a terminal;
      also PYTHONINSPECT=x
于 2013-09-07T17:17:29.377 回答
43

问题是由于 Cygwin 终端 (MinTTY) 的行为方式,Python 的本机 Windows 构建没有意识到 stdout 是终端设备——它认为它是一个管道,因此它以非交互模式运行交互模式,它完全缓冲其输出而不是行缓冲。

这是新的原因可能是因为在您之前的 Cygwin 安装中,您没有 MinTTY,并且使用的终端只是标准的 Windows 终端。

为了解决这个问题,您要么需要从常规 Windows 终端 ( Cmd.exe) 运行 Python,要么安装 Cygwin 版本的 Python 而不是 Python 的原生 Windows 版本。Cygwin 版本(可通过 Cygwin's 作为软件包安装setup.exe)理解 Cygwin 终端,并在通过 MinTTY 运行时适当地运行。

如果你想要的特定版本的 Python 没有 Cygwin 包,那么你也可以下载 Python 的源代码并在 Cygwin 下自己构建它。如果您还没有 Cygwin 编译器工具链(GCC),您将需要一个 Cygwin 编译器工具链,但我相信它应该使用标准./configure && make && make install命令进行编译。

于 2012-11-27T16:45:06.453 回答
11

我在 Mercurial (hg)+OpenSSH、Python 和 MinTTY 上遇到了类似的问题,但在 MSYS 而不是 CygWin 下。尽管如此,据我所知,这和我的问题都是由于 MinTTY 没有处理使用本机 Windows 控制台功能的应用程序(在 Adam 的回答中,他详细解释了 Python)。

对我来说,我遵循了https://code.google.com/p/mintty/issues/detail?id=56#c64的评论 64 中的解决方案

通过编译 winpty ( https://github.com/rprichard/winpty ) 项目并在我的路径中,我能够从 MinTTY shell 运行本机Python(以交互模式)和 Mercurial,而无需特殊构建或开关(例如python -i) . 我所需要的只是在or命令之前附加console.exeor 。为方便起见,我添加了别名,这样无论我在 Linux shell 还是 Windows MinTTY bash shell 中,我都可以使用相同的命令。consolepythonhgalias hg="console.exe hg"

此外,此解决方案似乎适用于 python 和 hg 之外的更多本机应用程序。例如,运行mysql(带或不带-p)会产生相同的问题(例如“挂起”而没有输入提示)。附加console到它允许它像往常一样。

于 2014-04-19T00:18:09.347 回答
2

根据https://stackoverflow.com/a/9549255/745913你也可以试试

/cydrive/c/Python27/python.exe -i foo.py
于 2013-04-15T19:27:23.300 回答
2

另一个通用的解决方法是通过winpty https://github.com/rprichard/winpty调用它,这并不是一个真正的 python 特定问题。

于 2017-11-14T17:10:23.703 回答
1

在 CygWin 中管理不同版本 Python 的非 cygwin 位置:

$ /usr/sbin/alternatives.exe

在此处使用 --install 和 --config 选项,它的工作方式与update-alternatives在 Linux 系统上相同。我将其与该python -i方法一起使用,并且运行良好。

我还必须首先删除符号链接文件/usr/bin,因为它们是使用 CygWin 的 python 安装的,最初不是通过alternatives.exe 管理的。

于 2014-10-01T21:19:50.690 回答
0

我的解决方案涉及编写一个 shell 脚本来运行 python 应用程序。

python file.py "$@" | tee /dev/null

那个额外的 tee 命令(无处)似乎解决了这个问题。

于 2017-04-10T14:40:37.827 回答
-1

使用 cygwin 安装程序重新安装 mintty。之后不必使用 python -i 。

于 2018-01-10T04:25:27.740 回答