web-dev-qa-db-fra.com

L'appel de python sous CygWin sous Windows se bloque

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û? 

31
James Kanze

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.

33
Adam Rosenfield

Essaye ça

python -i

et oui vous trouverez quelques problèmes ici et là !!!

43
vikkyhacks

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.

10
martian111

Selon https://stackoverflow.com/a/9549255/745913 vous pouvez également essayer

/cydrive/c/Python27/python.exe -i foo.py
2
seeker

une autre solution de contournement universelle l'invoque via winptyhttps://github.com/rprichard/winpty et il ne s'agit pas vraiment d'un problème spécifique à Python. 

1
Ben

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/binfirst, car ils avaient été installés avec le python de CygWin et n'étaient pas gérés via alternatives.exe à l'origine. 

1
Ross Hodapp

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.

0
Juraj