2013-07-17 29 views
6

Vorrei chiamare sys.stdin.readlines() senza rimuovere nulla da stdin. Sto usando Python2.7 su Linux.python2.7 peek at stdin

Per esempio, quello che voglio è:

x = sys.stdin.readlines() 
y = sys.stdin.readlines() 

allora X e Y hanno stringhe identiche. Sarebbe accettabile se ho potuto leggere da stdin e mettere il contenuto nel

Sfondo:.

Ho un modulo che o accetta un file come input ed un argomento -opzionale OR "alcuni input convogliato nel modulo "e un argomento opzionale

mymodule.py myfile -option 
or 
echo "some input" | mymodule.py -option 

Ho questo funzionamento, e funziona bene. Sto verificando sys.stdin.isatty() per determinare se c'è un input in pipe. Se c'è, il modulo genererà un errore se c'è più di un argomento dalla riga di comando (ci può essere un argomento opzionale, ma nessun file specificato se c'è è stdin)

Il motivo per cui ho un problema è perché sono obbligato a far passare i test di unità sulla riga di comando ma anche in eclissi. Tutto funziona correttamente sulla riga di comando, ma sembra che il plugin PyUnit per eclipse utilizzi anche sys.stdin.

Se chiamo sys.stdin.readlines(), eclipse rinuncia ai test di unità in esecuzione. Inoltre, eclipse sta spingendo le cose in sys.stdin anche quando non si specifica alcun argomento, il che rende difficile determinare se ci sono argomenti validi o meno.

Mi sembra che in qualche modo ottenere sys.stdin.readlines() senza modificare i contenuti sarebbe una soluzione, ma non so come farlo. Qualsiasi risposta a risolvere questo problema sarebbe soddisfacente.

Eventuali duplicati: Peek into stream of Popen pipeline in Python

Grazie!

Edit: non avendo alcuna fortuna con qualcosa di simile ...

foo = sys.stdin.readlines() 
sys.stdin.write(foo) 

Edit: Rimosso ripristino stdin in tearDown e la messa in funzione di test, invece, ma nessun effetto

risposta

1

Quando leggi da una pipe, i dati non sono più nella pipe. Puoi usare un meccanismo di polling per vedere se ci sono dati da leggere, ma non puoi guardare i contenuti senza rimuovere i contenuti, almeno non su Linux.

Vorrei semplicemente ignorare stdin se viene fornito un file (vale a dire controllare prima l'argomento del file) e, se nessun file è stato fornito come argomento, convalidare stdin.

+0

cifre :(Speravo che fosse più simile a un file che potrei .seek (0) su ... – liang

+0

Mi sto rapidamente arrendendo. Stavo avendo un po 'di fortuna con la lettura da stdin, quindi l'impostazione sys.stdin = open ('/ dev/tty', 'r +'), ma questo non funziona in Eclipse. Esito a capire da dove proviene l'input, perché alla fine i clienti useranno il modulo sul comando linea comunque. Penso che la soluzione migliore sia il tuo suggerimento: controlla prima un file e poi guarda lo stdin – liang