使用Cygwin中的Windows Python

使用Cygwin中的Windows Python,python,windows,cygwin,Python,Windows,Cygwin,我最近一直在Windows上使用Cygwin。我想使用Windows安装的Python,所以在测试期间我使用的是/cygdrive/c/Python26/Python.exe myfile.py,而不是Python myfile.exe 除了打印之外,这几乎可以完美地工作。当我从Cygwin运行Windows Python时,直到执行完成,输出才会打印。它可以从explorer.exe或cmd.exe在Windows Python中正常运行,也可以使用Cygwin安装的Python(/bin/P

我最近一直在Windows上使用Cygwin。我想使用Windows安装的Python,所以在测试期间我使用的是
/cygdrive/c/Python26/Python.exe myfile.py
,而不是
Python myfile.exe

除了打印之外,这几乎可以完美地工作。当我从Cygwin运行Windows Python时,直到执行完成,输出才会打印。它可以从explorer.exe或cmd.exe在Windows Python中正常运行,也可以使用Cygwin安装的Python(
/bin/Python.exe
)在Cygwin中正常工作


有解决办法吗?重要的是能够运行Windows版本,但我希望使用Bash来完成所有操作。

如果刷新输出,也许可以

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()

真正的问题是,当您在任何Cygwin终端程序(如mintty)中运行命令时,它们都不能充当Windows控制台。只有基于Windows控制台的,如CMD或Console2才能做到这一点。因此,使用Cygwin终端时,Windows python.exe不会认为它正在与交互式控制台通信

这将导致缓冲输出,而不是像在交互式会话中那样在每一行上刷新缓冲区。这就是为什么Amro在每一行中添加flush()可以修复症状,但意味着要更改代码

在不更改代码的情况下,一种解决方案是在Python中使用命令行上的“-u”标志或设置PYTHONUNBUFFERED环境变量来关闭缓冲

export PYTHONUNBUFFERED=1

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

或以交互模式运行

/cydrive/c/Python27/python.exe -i foo.py
您也将无法在Cygwin终端中运行Windows python.exe交互模式。它不会启动交互式会话,但会挂起。我发现最好的解决方案似乎是使用“cygstart”(比使用“-I”选项更好):

这似乎也适用于ipython(如果已安装):


不回答最初的问题,但对于那些希望在Cygwin终端(例如在mintty中)内使用Python交互会话的用户,请使用“-i”选项启动Python,明确告诉它需要在交互模式下运行:

$ python -i
简洁的方法是在.bashrc中创建别名(知道它只在交互式终端会话中读取):


否则,Python将不知道它在控制台中运行,因为所有基于Cygwin pty的终端(mintty、rxvt和xterm)都被Windows识别为管道,而不是控制台。因此,Python认为没有控制台,并进入非交互模式。因此,如果您仍然想要交互模式,则需要显式地告诉Python使用它。但是,它仍然不能正常工作-仍然不能使用HOME或LEFT箭头键等等。

回答得很好。顺便说一句,我的安装中没有
Python27/Scripts/ipython.exe
,除非您安装像Enthough Python发行版这样的东西,否则它不会与Python一起提供。您可以使用easy_安装或从此处下载来为Windows安装它:这非常有用。注意:如果我按Ctrl+C来终止程序,在mintty中我仍然看不到回溯。使用cygstart时,Ctrl+C似乎不起作用。我改为使用从windows终端运行的Cygwin bash shell(尽管这不能正确解释某些控制代码)。哇,我被迫使用“奇妙的”Microsoft cmd.exe来构建代码,但是现在,有了这个提示,我可以使用Cygwin了,非常感谢!您是否尝试过从DOS提示符启动bash.exe?我认为这将解决您的问题,而无需使用-I选项或pythonunbuffer变量。相关人员:那么为什么我们不能使用主箭头键或左箭头键呢?有办法解决吗?@Timur:这就是我一直在寻找的答案。谢谢你的命令。将它添加到bash_概要文件中可以解决这个问题,但是在cygwin中对python的每次调用都是交互式的。再次感谢您的解决方案真的很有帮助。
cygstart /cygdrive/c/Python27/python.exe
cygstart /cygdrive/c/Python27/Scripts/ipython.exe
$ python -i
alias python='python -i'