从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键,等等。