2017-09-25 2 views
-1

Ich arbeite an einer Anwendung, die direkt oder über Stdin gestartet werden kann.Unterstützt sys.stdin.readlines() sowie Befehlszeilenargumente in Python?

Momentan, wenn ich keine Daten an die Anwendung leiten wird eine EOF nie empfangen und es wartet auf Eingabe (wie Strg + d). Dieser Code wie folgt aussieht:

while True: 
    line = sys.stdin.readline() 
    print("DEBUG: %s" % line) 
    if not line: 
     break 

Ich habe auch versucht:

for line in sys.stdin: 
    print("DEBUG (stdin): %s" % line) 
    return 

jedoch in beiden Fällen ein EOF nicht empfangen wird, wenn das Programm direkt gestartet wird, so hängt sie darauf gewartet.

Ich habe gesehen, dass einige Unix-Anwendungen eine einzige Befehlszeilen-Flag in Fällen, in denen stdin Eingabe erwartet wird, aber ich frage mich, ob es eine bessere Problemumgehung gibt dann das? Ich würde eher den Benutzer in der Lage sein, die Anwendung austauschbar zu verwenden, ohne sich daran zu erinnern, ein - Flag hinzuzufügen.

+0

was bedeutet 'über stdin' bedeuten? Bedeutet das, dass Sie es als Modul starten? – Sraw

+0

@StrawStdin sind die Daten, die von der Pipe in die Anwendung kommen, z. '' echo "a" | script.py''' setzt 'a' als Element von sys.stdin – Codingo

+0

Was ist Ihr System? Ich habe die STRG + D funktioniert, wenn Sie das Skript direkt ohne irgendeine Pipe in einem Linux aufrufen. –

Antwort

3

Das Beste, was Sie tun können, ist zu prüfen, ob die Standardeingabe ein TTY ist, und, wenn ja, es nicht lesen:

$ cat test.py 
import sys 

for a in sys.argv[1:]: 
    print("Command line arg:", a) 

if not sys.stdin.isatty(): 
    for line in sys.stdin: 
     print("stdin:", line, end="") 

$ python3 test.py a b c 
Command line arg: a 
Command line arg: b 
Command line arg: c 

$ { echo 1; echo 2; } | python3 test.py a b c 
Command line arg: a 
Command line arg: b 
Command line arg: c 
stdin: 1 
stdin: 2 

$ python3 test.py a b c < test.py 
Command line arg: a 
Command line arg: b 
Command line arg: c 
stdin: import os, sys 
stdin: 
stdin: for a in sys.argv[1:]: 
stdin:  print("Command line arg:", a) 
stdin: 
stdin: if not sys.stdin.isatty(): 
stdin:  for line in sys.stdin: 
stdin:   print("stdin:", line, end="") 
+0

Sieht so aus, als ob dies das Ticket ist - es macht jetzt Tests und es ist ziemlich robust. Irgendwelche Einschränkungen, denen Sie bewusst sind? – Codingo

Verwandte Themen