Вызов python под CygWin на Windows зависает
Установка новой системы Windows, я установил CygWin и 64
бит Python (2.7.3) в своих местоположениях по умолчанию (c:\cygwin
и
c:\Python27\python
), и добавили и CygWin bin, и
Python на мой путь (в переменной пользователя PATH). Из
нормальное командное окно, Python запускается отлично, но когда
Я вызываю его из bash
в среде CygWin, он зависает,
никогда не давая подсказки ввода.
Я делал это на других машинах ранее, но всегда с
более старые версии Python (32 бита) и CygWin, а также Python
в явно нестандартном месте. Кто-нибудь еще имел это
проблема, или может кто-нибудь сказать мне, что это может быть из-за?
Ответы
Ответ 1
Проблема заключается в том, что из-за того, что ведет себя терминал Cygwin (MinTTY), встроенная сборка Windows на Python не понимает, что stdout является терминальным устройством - он думает, что это канал, интерактивный режим вместо интерактивного режима, и он полностью буферизует свой вывод вместо буферизации строки.
Причина, по которой это ново, вероятно, потому что в вашей предыдущей установке Cygwin у вас не было MinTTY, а используемый терминал был стандартным терминалом Windows.
Чтобы исправить это, вам нужно либо запустить Python с обычного терминала Windows (Cmd.exe
), либо установить версию Cygwin Python вместо собственной сборки Windows на Python. Версия Cygwin (устанавливаемая как пакет через Cygwin setup.exe
) понимает терминалы Cygwin и действует надлежащим образом при запуске через MinTTY.
Если конкретная версия Python, которую вы хотите, недоступна в виде пакета Cygwin, вы также можете загрузить исходный код Python и создать его самостоятельно под Cygwin. Вам понадобится компилятор Cygwin-компилятора, если у вас его еще нет (GCC), но я считаю, что он должен компилироваться со стандартной командой ./configure && make && make install
.
Ответ 2
Попробуйте это
python -i
и да, вы найдете некоторые глюки здесь и там!!!
Ответ 3
У меня была аналогичная проблема с Mercurial (hg) + OpenSSH, Python и MinTTY, но в MSYS вместо CygWin. Тем не менее, насколько я могу судить, и эта, и моя проблема были вызваны тем, что MinTTY не обрабатывал приложения, которые используют собственные функции консоли Windows (в ответе здесь Адам, он подробно объяснил это для Python).
Для меня я выполнил решение, найденное в комментарии 64 https://code.google.com/p/mintty/issues/detail?id=56#c64
Когда проект winpty (https://github.com/rprichard/winpty) скомпилирован и на моем пути, я смог запустить native Python (в интерактивном режиме ) и Mercurial из оболочки MinTTY без специальных сборок или переключателей (например, python -i
). Все, что мне нужно было добавить console.exe
или console
перед командой python
или hg
. Для удобства я добавил псевдонимы, такие как alias hg="console.exe hg"
, поэтому я могу использовать те же команды, будь то в оболочке Linux или оболочке Windows MinTTY bash.
Кроме того, это решение работает для более собственных приложений за пределами python и hg. Например, запуск mysql
(с или без -p
) дал бы ту же проблему (например, "зависает" без приглашения ввода). Добавление к нему console
позволило сделать это как обычно.
Ответ 4
В соответствии с fooobar.com/questions/96832/... вы также можете попробовать
/cydrive/c/Python27/python.exe -i foo.py
Ответ 5
Для управления местоположениями не-cygwin разных версий Python в CygWin:
$ /usr/sbin/alternatives.exe
Используйте опции -install и --config здесь, он работает так же, как update-alternatives
в системе Linux.
Я использую это вместе с подходом python -i
, и он работает хорошо.
Мне также пришлось сначала удалить файлы sym-link в /usr/bin
, так как они были установлены с пионом CygWin и не управлялись с помощью alternatives.exe изначально.
Ответ 6
В моем решении было написано оболочку script для запуска приложения python.
python file.py "[email protected]" | tee /dev/null
Эта дополнительная команда tee (в никуда), похоже, устраняет проблему.
Ответ 7
другое универсальное обходное обращение вызывает его через winpty
https://github.com/rprichard/winpty