![](/img/trans.png)
[英]Cygwin and Windows path conflict; using both Windows and cygwin Python
[英]Using Windows Python from Cygwin
我最近在Windows上使用过Cygwin。 我想使用Python的Windows安装,所以在测试期间我使用/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完成所有操作。
真正的问题是,当您在任何Cygwin终端程序(如mintty)中运行命令时,它们不会充当Windows控制台。 只有基于Windows控制台的程序(如CMD或Console2)才能执行此操作。 因此,对于Cygwin终端,Windows python.exe并不认为它正在与交互式控制台通信。
这导致缓冲输出而不是像在交互式会话中那样在每一行上刷新缓冲区。 这就是为什么Amro在每一行都添加了flush()来修复症状,但意味着更改代码。
不改变代码的一个解决方案是使用命令行上的“-u”标志或设置PYTHONUNBUFFERED环境变量来关闭Python中的缓冲。
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
没有回答最初的问题,但对于那些想要在Cygwin终端内使用Python交互式会话的人 (例如在mintty中) - 使用“-i”选项启动Python以明确告诉它需要以交互模式运行:
$ python -i
简洁的方法是在你的.bashrc中创建一个别名(知道它只能用于交互式终端会话):
alias python='python -i'
否则,Python将不知道它在控制台中运行,因为所有基于Cygwin pty的终端(mintty,rxvt和xterm)都被Windows识别为管道,而不是控制台。 因此,Python认为没有控制台并进入非交互模式。 因此,如果您仍然需要交互模式,则需要明确告诉Python使用它。 但是,它仍然不会像通常那样运行 - 仍然无法使用HOME或左箭头键,依此类推。
也许你刷新输出
import sys
V = range(100000)
for x in V:
print x
sys.stdout.flush()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.