Использование 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 ответа:
возможно, если вы сбросите вывод
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 и т. д.