Использование Windows Python от Cygwin - PullRequest
61 голосов
/ 15 июля 2010

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

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

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

Ответы [ 3 ]

115 голосов
/ 03 марта 2012

Настоящая проблема заключается в том, что когда вы запускаете команду в любой из терминальных программ Cygwin, таких как mintty, они не действуют как консоли Windows.Только Windows Console-based, такие как 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

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

cygstart /cygdrive/c/Python27/python.exe

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

cygstart /cygdrive/c/Python27/Scripts/ipython.exe
38 голосов
/ 03 сентября 2012

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

$ python -i

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

alias python='python -i'

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

24 голосов
/ 15 июля 2010

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

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...