2017-03-14 2 views
0

ich bin in diesem Augenblick durch einige Übungen in Python ausgeführt werden, einschließlich einem einfachen Zeilenzählers, der eine Eingabe von der Kommandozeile oder stdin nehmen:Stdin Arbeiten nicht wie beabsichtigt [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)) 

Wenn ich eine Eingabe Datei in der Befehlszeile, dh python line_count1.py file_with_4_lines.txt, es funktioniert großartig, und ich bekomme die Ausgabe:

File given at command line 
4 

Allerdings, wenn ich es geben, so dass es stdin über python line_count1 entbindet .py, bekomme ich die folgende Ausgabe:

Needs stdin 
_ 

Aber eigentlich tut nichts mit meinem Standard-Eintrag. Ich kann file_with_4_lines.txt eingeben, aber dann dauert es nur und wartet auf mich, um eine andere stdin-Linie einzugeben, nie ausbrechend, bis ich den Code im Aufgabenmanager töten muss.

Was würde dazu führen, dass dies geschieht? Sobald ich etwas für stdin eingegeben habe, sollte der Rest des Codes durchgehen. Aber es ist nicht. Was vermisse ich?

+0

Erwarten Sie es, den Inhalt von 'zu lesen file_with_4_lines.txt', wenn Sie 'file_with_4_lines.txt' in' stdin' eingeben? Denn so funktioniert 'stdin' nicht ... – ShadowRanger

+0

Es soll die Dateivariable mit stdin gleichsetzen, die dann in count_lines (Datei) verwendet wird. – Chase

Antwort

1

Dies bezieht sich nicht auf Ihren Code, sondern bezieht sich auf das stdin Leseverhalten auf einem Terminal. Weitere Informationen finden Sie im folgenden Post: https://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input.

EDIT: Wie @Chase sagte, ist der Schlüssel, um Stdin auf Fenster zu beenden, Ctrl+Z, und auf Linux ist es Ctrl+D.

+0

Dies scheint es nicht zu lösen, indem man file_with_4_lines.txt eingibt^D beendet nicht stdin, file_with_4_lines.txt nicht, dann^D in der nächsten Zeile. – Chase

+0

ZU KÜNFTIGEN LESERN: Das Problem war, dass ich auf Windows und nicht auf Linux bin. Windows endet mit Strg + Z, nicht Strg + D. – Chase

0

Es klingt, als ob Sie einen Dateinamen von stdin akzeptieren möchten, wenn er nicht an der Befehlszeile angegeben wird, wenn das, was Sie gerade tun, versucht, stdin selbst zu zählen.

Wenn das Ziel, eine bestimmte Datei zu verarbeiten ist, woher der Name entweder stdin oder die Befehlszeile kommt, dann sollte der Code geändert werden:

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)) 
Verwandte Themen