在Cygwin中使用Windows Python

64 投票
3 回答
79912 浏览
提问于 2025-04-16 01:19

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

这个方法几乎完美运行,除了打印输出的问题。当我从Cygwin运行Windows的Python时,输出结果要等到程序执行完才会显示。而在Windows的资源管理器或者命令提示符下运行Python时,输出是正常的。此外,使用Cygwin自带的Python(/bin/python.exe)时,输出也没有问题。

有没有什么解决办法?最重要的是我想运行Windows版本的Python,但我希望能在Bash环境下完成这一切。

3 个回答

42

这里不回答最初的问题,但如果你想在Cygwin终端(比如在mintty中)使用Python交互式会话,可以在启动Python时加上“-i”这个选项,这样Python就知道要以交互模式运行了:

$ python -i

一个比较好的方法是,在你的.bashrc文件中创建一个别名(因为这个文件只会在交互式终端会话中被读取):

alias python='python -i'

否则,Python会不知道自己是在控制台中运行,因为所有基于Cygwin的终端(如mintty、rxvt和xterm)在Windows看来都是管道,而不是控制台。因此,Python会认为没有控制台可用,就进入了非交互模式。如果你想要交互模式,就需要明确告诉Python使用它。不过,即使这样,它的表现也不会像平常那样——你仍然无法使用HOME键或左箭头键等等。

118

真正的问题在于,当你在Cygwin的终端程序,比如mintty,里运行命令时,它们并不像Windows的控制台那样工作。只有像CMD或Console2这样的Windows控制台才是这样。所以,在Cygwin的终端里,Windows的python.exe并不知道自己是在和一个互动的控制台对话。

这就导致输出会被缓冲,而不是像在互动会话中那样每行都立即显示。这就是为什么Amro在每行加上flush()能解决这个问题,但这也意味着需要修改代码。

有一个不需要改代码的解决办法,就是在命令行中使用'-u'选项来关闭Python的缓冲,或者设置PYTHONUNBUFFERED这个环境变量。

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

你在Cygwin终端里也无法运行Windows的python.exe的互动模式。它不会启动一个互动会话,而是会卡住。我发现最好的解决办法是使用'cygstart'(比使用'-i'选项更好):

cygstart /cygdrive/c/Python27/python.exe

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

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

也许你可以尝试刷新一下输出

import sys

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

撰写回答