2017-09-25 17 views
-1

Je travaille sur une application qui peut être lancée directement, ou via stdin.Support de sys.stdin.readlines() ainsi que des arguments de ligne de commande en python?

Actuellement, si je ne transfère aucune donnée vers l'application, un EOF n'est jamais reçu et il se bloque en attente d'une entrée (comme ctrl + d). Le code ressemble à:

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

J'ai aussi essayé:

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

Cependant dans les deux cas, un EOF n'est pas reçu si le programme est lancé directement il se bloque attendre.

J'ai vu des applications unix passer un seul drapeau de ligne de commande - dans les cas où l'entrée stdin est attendue mais je me demande s'il existe une meilleure solution de rechange que celle-ci? Je préfère que l'utilisateur puisse utiliser l'application de manière interchangeable sans se souvenir d'ajouter un drapeau -.

+0

qu'est-ce que 'via stdin' signifie? Cela signifie-t-il que vous le lancez en tant que module? – Sraw

+0

@Sraw Stdin est la donnée provenant de lorsque vous faites pipi dans l'application, par exemple. '' 'echo" a "| script.py''' met 'a' en tant qu'élément de sys.stdin – Codingo

+0

Quel est votre système? J'ai obtenu le CTRL + D travaillé lors de l'appel du script directement sans aucun tuyau dans un Linux. –

Répondre

3

Le mieux que vous pouvez faire est de vérifier si l'entrée standard est un ATS, et, si oui, lisez pas:

$ 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

On dirait que c'est le ticket - faire des tests maintenant et c'est assez robuste. Des limitations que vous connaissez? – Codingo