在Windows上调用CygWin下的python挂起

时间:2012-11-27 16:17:28

标签: python cygwin

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

我之前已在其他机器上完成此操作,但始终使用 旧版本的Python(32位)和CygWin,以及Python 在一个决定性的非标准位置。有没有其他人这样做过 问题,还是有人能告诉我它可能是什么原因?

8 个答案:

答案 0 :(得分:44)

试试这个

python -i

是的,你会在这里找到一些小故障!!!

答案 1 :(得分:33)

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

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

为了解决这个问题,您需要从常规Windows终端(Cmd.exe)运行Python,或者安装Cygwin版本的Python而不是Python的本机Windows版本。 Cygwin版本(可通过Cygwin的setup.exe安装为程序包)了解Cygwin终端并在通过MinTTY运行时正常运行。

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

答案 2 :(得分: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)。我只需要在console.execonsole命令之前附加pythonhg。为方便起见,我添加了alias hg="console.exe hg"等别名,所以我可以使用相同的命令,无论我是在Linux shell还是Windows MinTTY bash shell中。

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

答案 3 :(得分:2)

根据https://stackoverflow.com/a/9549255/745913,您也可以尝试

/cydrive/c/Python27/python.exe -i foo.py

答案 4 :(得分:1)

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

$ /usr/sbin/alternatives.exe

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

我还必须首先删除/usr/bin中的sym-link文件,因为它们与CygWin的python一起安装,而不是最初通过alternatives.exe进行管理。

答案 5 :(得分:1)

另一种通用的解决方法是通过winpty https://github.com/rprichard/winpty调用它,这实际上并不是特定于python的问题。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:-1)

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