6
votes

Comment envoyer EOF à Python Syts.stsdin de Commandline? Ctrl-D ne fonctionne pas

J'écris à mon processus Python à partir de la ligne de commande sur UNIX. Je veux envoyer EOF (ou en quelque sorte sur le tampon STDIN, donc Python peut lire mon entrée.)

Si je frappe Ctrl-C, je reçois un clavierError.

Si je frappe Ctrl-D, le programme arrête simplement.

Comment puis-je chasser le tampon STDIN?


2 commentaires

La plupart des terminaux fonctionnent, dès que vous appuyez sur Entrée, votre entrée est envoyée à Python.


Si vous souhaitez modifier la manière dont cela fonctionne, Python doit modifier les paramètres de terminal, qui est la magie noire ... Voir le module TERMIOS peut-être? docs.python.org/library/termios.html


4 Réponses :


2
votes

Si vous utilisez 'pour l dans Sys.stdin', il est tamponné.

Vous pouvez utiliser: p>

  while 1:
     l = sys.stdin.readline()


3 commentaires

C'est tamponné de toute façon. Il n'y a pas de différence entre les deux.


En fait, ce qui précède a travaillé pour moi. Je pense que j'ai lu sur la liste de diffusion que "pour l in Sys.stdin" a un tampon interne supplémentaire, alors que Sys.stdin.readline () ne le fait pas.


@Jasonorendorff: En fait, il y a une différence sur Python 2 en raison de Bug tampon de lecture . Vous pouvez utiliser pour la ligne dans iter (sys.stdin.readline, ''): pour le contourner. Essayez d'exécuter chat | Python2 -C "" et tapez une entrée. readline () La variante conduit aux lignes disponibles immédiatement.



14
votes

Control-d ne doit pas faire votre programme "juste arrêter" - il doit fermer l'entrée standard et si votre programme traite correctement, il peut parfaitement continuer s'il doit être!

Par exemple, étant donné le Suivant st.py : xxx

Nous pouvions voir quelque chose comme xxx

si le contrôle -D est touché juste après l'entrée sur la troisième ligne - le programme réalise que l'entrée standard est effectuée et effectue le post-traitement requis, tous soignés et appropriés.

Si votre programme sort prématurément sur le contrôle -D, il doit être mal codé - Qu'en est-il de la modification de votre question pour ajouter le programme "MISSURAGE" le plus petit que vous puissiez concevoir, afin que nous puissions vous montrer exactement comment vous allez mal?


0 commentaires

2
votes

Je pense que je sais ce qui se passe. Vous frappez ctrl-d sans frapper entrer . Si vous souhaitez envoyer une ligne au programme, appuyez simplement sur Entrée. Si vous appuyez sur ctrl-d sans frapper Entrée , vous pouvez appuyer sur Ctrl-D à nouveau et votre programme doit voir la ligne alors. Dans ce cas (deux Ctrl-D S successions), votre programme ne verra pas une nouvelle ligne à la fin de la ligne.

Par exemple, disons que j'ai un script Python a.py : xxx

et je l'exécute: xxx

puis entrez les éléments suivants: < / p> xxx

Le programme imprimera: xxx

$ est l'invite de shell. Voici une session complète avec l'entrée ci-dessus:

$ python a.py
ligne 1
Ligne 2 ligne1
ligne 2 $

( gras montrer la sortie du programme. L'affaire romaine est destinée à montrer ce que j'ai saisi, Sans les deux Ctrl-D s)

Si ce n'est pas ce qui se passe, vous devez nous en dire plus sur ce que vous faites.


0 commentaires

1
votes
try:
    # You might be inside the while-loop
    foo = raw_input('Spam: ') # Or whatever...
except EOFError:
    print 'And now for something completely different.'
    sys.exit()

0 commentaires