web-dev-qa-db-fra.com

Utilisation de Windows Python de Cygwin

J'utilise Cygwin sous Windows récemment. Je souhaite utiliser l'installation Windows de Python, donc pendant les tests, j'utilise /cygdrive/c/Python26/python.exe myfile.py Plutôt que python myfile.exe.

Cela fonctionne presque parfaitement, sauf pour l'impression. Lorsque j'exécute Windows Python de Cygwin, la sortie ne s'imprime pas tant que l'exécution n'est pas terminée. Cela fonctionne correctement sous Windows Python à partir d'Explorer.exe ou cmd). exe, et cela fonctionne dans Cygwin en utilisant le Python (/bin/python.exe) installé par Cygwin).

Existe-t-il une solution à cela? L'important est de pouvoir exécuter la version Windows, mais j'aimerais tout faire avec Bash.

61
Skilldrick

Peut-être que si vous videz la sortie

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()
24
Amro

Le vrai problème est que lorsque vous exécutez une commande dans l'un des programmes de terminal Cygwin comme mintty, ils n'agissent pas comme des consoles Windows. Seuls ceux basés sur la console Windows comme CMD ou Console2 le font. Ainsi, avec les terminaux Cygwin, Windows python.exe ne pense pas qu'il parle à une console interactive.

Cela conduit à la mise en mémoire tampon de la sortie au lieu de vider les tampons sur chaque ligne comme cela se fait dans les sessions interactives. C'est pourquoi Amro ajoute le flush () sur chaque ligne résout le problème, mais signifie changer le code.

Une solution sans changer le code consiste à désactiver la mise en mémoire tampon dans Python en utilisant l'indicateur '-u' sur la ligne de commande ou en définissant la variable d'environnement PYTHONUNBUFFERED.

export PYTHONUNBUFFERED=1

/cydrive/c/Python27/python.exe foo.py

ou

/cydrive/c/Python27/python.exe -u foo.py

ou exécuter en mode interactif

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

Vous ne pourrez pas non plus exécuter le mode interactif Windows python.exe dans le terminal Cygwin. Il n'ouvrira pas une session interactive, mais se bloquera simplement. Je trouve que la meilleure solution semble être d'utiliser 'cygstart' (mieux que d'utiliser l'option '-i'):

cygstart /cygdrive/c/Python27/python.exe

Et cela semble également fonctionner avec ipython (s'il est installé):

cygstart /cygdrive/c/Python27/Scripts/ipython.exe
117
noisygecko

Ne répondant pas à la question initiale, mais pour ceux qui souhaitent utiliser session interactive Python depuis le terminal Cygwin (par exemple dans mintty) - start Python avec "-i" option pour lui dire explicitement qu'il doit fonctionner en mode interactif:

$ python -i

La bonne façon est également de créer un alias dans votre .bashrc (sachant qu'il n'est lu que pour les sessions de terminal interactives de toute façon):

alias python='python -i'

Sinon, Python ne saura pas qu'il s'exécute dans la console, car tous les terminaux basés sur Cygwin pty (mintty, rxvt et xterm) sont reconnus comme des canaux par Windows, pas comme la console. Par conséquent, Python pense qu'il n'y a pas de console et passe en mode non interactif. Donc, si vous voulez toujours le mode interactif à la place, vous devez dire explicitement Python pour l'utiliser) Cependant, il ne se comportera toujours pas comme il le devrait normalement - on ne pourra toujours pas utiliser les touches HOME ou FLÈCHE GAUCHE, et ainsi de suite.

38
Timur