En installant un nouveau système Windows, j'ai installé CygWin et Python 64 Bit (2.7.3) dans leurs emplacements par défaut (c:\cygwin
et c:\Python27\python
), et ajouté le répertoire CygWin et le répertoire Python à mon chemin (dans la variable utilisateur PATH). Depuis La fenêtre de commande normale, Python démarre parfaitement, mais lorsque Je l’appelle de bash
dans l’environnement CygWin, il se bloque, Ne donnant jamais l’invite d’entrée.
Je l'ai déjà fait sur d'autres machines, mais toujours avec Des versions antérieures de Python (32 bits) et CygWin, et avec Python dans un emplacement non standard. Est-ce que quelqu'un d'autre a eu ce problème, ou quelqu'un pourrait-il me dire à quoi il pourrait être dû?
Le problème est qu’en raison du comportement du terminal Cygwin (MinTTY), la version native de Python pour Windows ne réalise pas que stdout est un périphérique terminal. du mode interactif, et il tamponne complètement sa sortie au lieu de le mettre en mémoire tampon.
La raison pour laquelle cela est nouveau est probablement due au fait que dans votre précédente installation Cygwin, vous n’aviez pas MinTTY et que le terminal utilisé était uniquement le terminal Windows standard.
Pour résoudre ce problème, vous devez exécuter Python à partir d'un terminal Windows standard (Cmd.exe
) ou installer la version Cygwin de Python au lieu d'une version Windows native de Python. La version de Cygwin (installable en tant que package via le setup.exe
de Cygwin) comprend les terminaux Cygwin et agit de manière appropriée lorsqu’elle est exécutée via MinTTY.
Si la version de Python que vous souhaitez n'est pas disponible sous forme de package Cygwin, vous pouvez également télécharger le code source de Python et le construire vous-même sous Cygwin. Vous aurez besoin d’une chaîne d’outils de compilation Cygwin si vous n’en avez pas déjà une (GCC), mais je pense qu’elle devrait être compilée avec une commande standard ./configure && make && make install
.
Essaye ça
python -i
et oui vous trouverez quelques problèmes ici et là !!!
J'ai eu un problème similaire avec Mercurial (hg) + OpenSSH, Python et MinTTY, mais sous MSYS au lieu de CygWin. Néanmoins, autant que je sache, ceci et mon problème sont dus au fait que MinTTY n’a pas à gérer des applications qui utilisent les fonctions de console Windows natives (dans une réponse donnée par Adam, il l’a expliqué en détail pour Python).
Pour moi, j'ai suivi la solution trouvée dans le commentaire 64 de https://code.google.com/p/mintty/issues/detail?id=56#c64
Avec le projet winpty ( https://github.com/rprichard/winpty ) compilé et sur mon chemin, j'ai pu exécuter native Python (en mode interactif) et Mercurial à partir de MinTTY Shell sans des constructions ou des commutateurs spéciaux (tels que python -i
). Tout ce dont j'avais besoin était d’ajouter console.exe
ou console
avant la commande python
ou hg
. Pour plus de commodité, j'ai ajouté des alias tels que alias hg="console.exe hg"
afin que je puisse utiliser les mêmes commandes que je sois dans un shell Linux ou un shell Windows MinTTY bash.
En outre, cette solution semble fonctionner pour plusieurs applications natives autres que python et hg. Par exemple, exécuter mysql
(avec ou sans -p
) aurait posé le même problème (par exemple, "se bloque" sans invite d'entrée). Y ajouter console
lui a permis de continuer comme d’habitude.
Selon https://stackoverflow.com/a/9549255/745913 vous pouvez également essayer
/cydrive/c/Python27/python.exe -i foo.py
une autre solution de contournement universelle l'invoque via winpty
https://github.com/rprichard/winpty et il ne s'agit pas vraiment d'un problème spécifique à Python.
Pour gérer les emplacements non cygwin de différentes versions de Python dans CygWin:
$ /usr/sbin/alternatives.exe
Utilisez les options --install et --config ici, cela fonctionne de la même manière que update-alternatives
sur un système Linux . J'utilise ceci avec l'approche python -i
et ça fonctionne bien.
J'ai également dû supprimer les fichiers sym-link dans /usr/bin
first, car ils avaient été installés avec le python de CygWin et n'étaient pas gérés via alternatives.exe à l'origine.
Ma solution a consisté à écrire un script Shell pour exécuter l'application Python.
python file.py "$@" | tee /dev/null
Cette commande de tee supplémentaire (vers nulle part) semble résoudre le problème.