2017-03-14 1 views
0

Je suis en cours d'exécution à travers quelques exercices en Python en ce moment, y compris un compteur simple ligne qui peut prendre l'entrée de la ligne de commande ou stdin:Stdin ne fonctionne pas comme prévu [Python]

#### line_count1.py #### 

import sys 

def count_lines(file): 
    n = 0 
    for line in file: 
     n = n + 1 
    return n 

if len(sys.argv) == 1: 
    print("Needs stdin") 
    file = sys.stdin 
else: 
    print("File given at command line") 
    file = open(sys.argv[1]) 

print (count_lines(file)) 

Si j'entre une fichier à la ligne de commande, à savoir python line_count1.py file_with_4_lines.txt, il fonctionne très bien, et je reçois la sortie:

File given at command line 
4 

Cependant, si je saisis afin qu'il a besoin stdin via python line_count1 .py, je reçois la sortie suivante:

Needs stdin 
_ 

Mais ne fait jamais rien avec mon entrée stdin. Je peux entrer file_with_4_lines.txt, mais alors il le prend juste et attend moi pour entrer une autre ligne de stdin, n'éclatant jamais jusqu'à ce que je dois tuer le code dans le gestionnaire de tâches.

Qu'est-ce qui causerait cela? D'après ce que je comprends, dès que j'entre quelque chose pour stdin qui devrait déclencher le reste du code à passer. Mais ce n'est pas. Qu'est-ce que je rate?

+0

vous attendez-vous à lire le contenu de ' file_with_4_lines.txt' quand vous tapez 'file_with_4_lines.txt' dans le cas' stdin'? Parce que ce n'est pas comme ça que 'stdin' fonctionne ... – ShadowRanger

+0

Il est supposé égaler la variable de fichier avec stdin, qui est ensuite utilisée dans count_lines (fichier). – Chase

Répondre

1

Ceci n'est pas lié à votre code, mais lié au comportement de lecture stdin sur un terminal. Voir le post suivant pour plus d'informations: https://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input. Comme le dit @Chase, la clé pour terminer stdin sur la fenêtre est Ctrl+Z, et sur Linux, Ctrl+D.

+0

Cela ne semble pas le résoudre, en entrant file_with_4_lines.txt^D ne quitte pas stdin, ni file_with_4_lines.txt, alors^D sur la ligne suivante. – Chase

+0

AUX LECTEURS FUTURS: Le problème était que je suis sur Windows, pas Linux. Windows se termine par Ctrl + Z, pas Ctrl + D. – Chase

0

Il semble que vous vouliez accepter un nom de fichier de stdin s'il n'est pas indiqué sur la ligne de commande, alors que ce que vous faites en ce moment tente de compter stdin lui-même.

Si l'objectif est de traiter un fichier donné, où le nom provient soit stdin ou la ligne de commande, le code doit être modifié à:

if len(sys.argv) == 1: 
    # Prompt for and read a single line from stdin to get the desired file name 
    filename = input("Needs stdin") # On Py2, use raw_input, not input 
else: 
    print("File given at command line") 
    # Use argument as filename 
    filename = sys.argv[1] 

# Open the name provided at stdin or command line 
# Use with statement so it's properly closed when you're done 
with open(filename) as file: 
    print(count_lines(file))