使用Cygwin中的Windows Python

2024-04-28 22:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在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在Cygwin中运行(/bin/python.exe)。

有办法解决这个问题吗?重要的是能够运行Windows版本,但是我想用Bash来完成这一切。


Tags: py版本cmdbashbinwindowsmyfileexe
3条回答

如果你刷新输出

import sys

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

真正的问题是,当您在任何一个Cygwin终端程序(如mintty)中运行命令时,它们都不能充当Windows控制台。只有像CMD或Console2这样基于Windows控制台的操作系统才能做到这一点。因此,对于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终端(例如mintty)中使用Python interactive session的人来说-用“-i”选项启动Python,明确地告诉它需要在交互模式下运行:

$ python -i

简单的方法是在.bashrc中创建一个别名(知道它只在交互式终端会话中读取):

alias python='python -i'

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

相关问题 更多 >