Использование Windows Python из Cygwin


Я недавно использовал Cygwin в Windows. Я хочу использовать установку Windows Python, поэтому во время тестирования я использую /cygdrive/c/Python26/python.exe myfile.py, а не python myfile.exe.

это работает почти идеально, за исключением печати. Когда я запускаю Windows Python из Cygwin, вывод не печатается до завершения выполнения. Он отлично работает в Windows Python из проводника.exe или cmd.exe, и он работает в Cygwin с помощью Cygwin-установленного Python (/bin/python.exe).

есть обходной путь для этого? Важно иметь возможность запускать версию Windows, но я хотел бы сделать все это с помощью Bash.

3 60

3 ответа:

возможно, если вы сбросите вывод

import sys

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

реальная проблема заключается в том, что когда вы запускаете команду в любой из программ терминала Cygwin, таких как mintty, они не действуют как консоли Windows. Только консольные Windows, такие как CMD или Console2, делают это. Итак, с терминалами Cygwin Windows python.exe не думает, что он разговаривает с интерактивной консолью.

это приводит к буферизации вывода вместо промывки буферов на каждой строке, как это делается в интерактивных сеансах. Именно поэтому добавление AMRO в промывочный() на каждую строку исправления симптом, но означает изменение кода.

одним из решений без изменения кода является отключение буферизации в Python с помощью флага '- u ' в командной строке или установка переменной среды 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

вы также не сможете запустить Windows python.интерактивный режим EXE-файл в терминал с Cygwin. Он не будет вызывать интерактивную сессию, но будет просто висеть. Я найду самое лучшее решение, кажется, чтобы использовать 'cygstart' (лучше, чем с помощью опции-I'):

cygstart /cygdrive/c/Python27/python.exe

и это, кажется, работает с ipython, а также (если установлен):

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

не отвечая на первоначальный вопрос, но для тех, кто хочет использовать интерактивная сессия Python из терминала Cygwin (например, в mintty) - запустите Python с опцией "- i", чтобы явно указать, что он должен работать в интерактивном режиме:

$ python -i

аккуратный способ также создать псевдоним в вашей .bashrc (зная, что он все равно читается только для интерактивных терминальных сеансов):

alias python='python -i'

в противном случае Python не будет знать, что он работает в консоль, потому что все терминалы на основе Cygwin pty (mintty, rxvt и xterm) распознаются Windows как каналы, а не как консоль. Поэтому Python считает, что нет консоли и переходит в неинтерактивный режим. Так что, если вы все еще хотите интерактивный режим вместо этого, вам нужно явно сказать Python, чтобы использовать его. Однако он по - прежнему не будет вести себя так, как обычно-по-прежнему нельзя будет использовать клавиши HOME или LEFT ARROW и т. д.