使用Cygwin的Windows Python

Ski*_*ick 62 python windows 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完成所有操作.

noi*_*cko 118

真正的问题是,当您在任何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
Run Code Online (Sandbox Code Playgroud)

要么

/cydrive/c/Python27/python.exe -u foo.py
Run Code Online (Sandbox Code Playgroud)

或以交互模式运行

/cydrive/c/Python27/python.exe -i foo.py
Run Code Online (Sandbox Code Playgroud)

您也无法在Cygwin终端中运行Windows python.exe交互模式.它不会启动交互式会话,但会挂起.我发现最好的解决方案似乎是使用'cygstart'(比使用'-i'选项更好):

cygstart /cygdrive/c/Python27/python.exe
Run Code Online (Sandbox Code Playgroud)

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

cygstart /cygdrive/c/Python27/Scripts/ipython.exe
Run Code Online (Sandbox Code Playgroud)


Tim*_*mur 39

不回答最初的问题,但对于那些谁想要使用Python交互会话从Cygwin的终端(例如,在mintty)内-开始用Python"-i"选项,它需要在交互模式下运行,以明确告诉它:

$ python -i
Run Code Online (Sandbox Code Playgroud)

整洁的方式也建立在你的.bashrc别名(知道它是只读的交互式终端会话反正):

alias python='python -i'
Run Code Online (Sandbox Code Playgroud)

否则,Python将不知道它在控制台中运行,因为所有基于Cygwin pty的终端(mintty,rxvt和xterm)都被Windows识别为管道,而不是控制台.因此,Python认为没有控制台并进入非交互模式.因此,如果您仍然需要交互模式,则需要明确告诉Python使用它.但是,它仍然不会像通常那样表现 - 一个仍然无法使用HOME或左箭头键,依此类推.

  • 那么为什么我们无法使用HOME或左箭头键?有没有办法解决这个问题? (5认同)

Amr*_*mro 24

也许你刷新输出

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)