从Cygwin使用Windows Python

我最近在Windows上使用Cygwin。 我想使用Python的Windows安装,所以在testing期间我使用/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() 

真正的问题是,当你在任何一个像mintty这样的Cygwinterminal程序中运行一个命令时,它们不会充当Windows控制台。 只有像CMD或Console2这样的Windows控制台才能做到这一点。 所以,用CygwinterminalWindows python.exe不认为它正在交谈控制台。

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

不改变代码的一个解决scheme是使用命令行中的'-u'标志或者设置PYTHONUNBUFFERED环境variables来closuresPython中的缓冲。

 export PYTHONUNBUFFERED=1 /cydrive/c/Python27/python.exe foo.py 

要么

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

或以交互模式运行

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

您也将无法在Cygwinterminal中运行Windows python.exe交互模式。 它不会提出一个交互式会话,但会挂起。 我发现最好的解决scheme似乎是使用“cygstart”(比使用“-i”选项更好):

 cygstart /cygdrive/c/Python27/python.exe 

这似乎也与ipython(如果安装)一起工作:

 cygstart /cygdrive/c/Python27/Scripts/ipython.exe 

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

 $ python -i 

整洁的方法也是在你的.bashrc中创build一个别名(知道它只能用于交互式terminal会话):

 alias python='python -i' 

否则,Python不会知道它在控制台中运行,因为所有基于Cygwin pty的terminal(mintty,rxvt和xterm)都被Windows识别为pipe道,而不是控制台。 因此,Python认为没有控制台,并进入非交互模式。 所以,如果你仍然想要交互模式,你需要明确告诉Python使用它。 但是,它仍然不会像通常那样运行 – 仍然不能使用HOME或LEFT ARROW键,等等。