Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

import sys

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

Ответ 2

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

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

Одним из решений без изменения кода является отключение буферизации в 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

Вы также не сможете запустить интерактивный режим python.exe Windows на терминале Cygwin. Это не вызовет интерактивный сеанс, а просто повесит. Я считаю, что лучшим решением является использование "cygstart" (лучше, чем использование опции "-i" ):

cygstart /cygdrive/c/Python27/python.exe

И это похоже на работу с ipython (если установлено):

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

Ответ 3

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

$ python -i

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

alias python='python -i'

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